]> git.openstreetmap.org Git - rails.git/blob - vendor/assets/iD/iD.js
1d075cf073a41d550eef02faa4ce314be23e4741
[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 threshold(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 * (threshold(values, 0.75) - threshold(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 threshold(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() {
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] = threshold(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()
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$1() {
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$1()
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: threshold,
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,
16985     scaleQuantize: quantize,
16986     scaleThreshold: threshold$1,
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:"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:"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: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:{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:"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:{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:{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:"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:{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"}}];
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})"},no_issues:{message:"Everything looks fine",info:"Any issues will show up here as you edit"},almost_junction:{message:"{feature} is very close but not connected to {feature2}","highway-highway":{tip:"Intersecting highways should share a junction vertex."}},crossing_ways:{message:"{feature} crosses {feature2}","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:{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:{highway:{message:"{highway} is disconnected from other roads and paths",tip:"Highways should connect to other highways or building entrances."}},generic_name:{message:"{feature} has the generic name \"{name}\"",tip:"Names should be the actual, on-the-ground names of features."},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_tag:{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:{message:"{multipolygon} has misplaced tags",tip:"Multipolygons should be tagged on their relation, not their outer way."},tag_suggests_area:{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_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"},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"},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:""},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 Vending Machine",terms:"excrement bags,poop,dog,animal"},"amenity/vending_machine/feminine_hygiene":{name:"Feminine Hygiene Vending Machine",terms:"condom,tampon,pad,woman,women,menstrual hygiene products,personal care"},"amenity/vending_machine/food":{name:"Food Vending Machine",terms:"food"},"amenity/vending_machine/fuel":{name:"Gas Pump",terms:"petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel"},"amenity/vending_machine/ice_cream":{name:"Ice Cream Vending Machine",terms:"chocolate,ice cream,frozen,popsicle,vanilla"},"amenity/vending_machine/newspapers":{name:"Newspaper Vending Machine",terms:"newspaper"},"amenity/vending_machine/parcel_pickup_dropoff":{name:"Parcel Pickup/Dropoff 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:"Jeweler",terms:"bracelet,diamond,earrings,gem,necklace,pins,ring"},"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_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_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","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"},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","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","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","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"],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"],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}","fee","payment_multi","currency_multi"],geometry:["point"],terms:["excrement bags","poop","dog","animal"],tags:{amenity:"vending_machine",vending:"excrement_bags"},reference:{key:"vending",value:"excrement_bags"},name:"Excrement Bag Vending Machine"},"amenity/vending_machine/feminine_hygiene":{icon:"temaki-vending_machine",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","necklace","pins","ring"],tags:{shop:"jewelry"},name:"Jeweler"},"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"],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","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:["structure_waterway","intermittent"],geometry:["line"],tags:{waterway:"ditch"},name:"Ditch"},"waterway/dock":{icon:"maki-harbor",fields:["name","dock","operator"],geometry:["area","vertex","point"],terms:["boat","ship","vessel","marine"],tags:{waterway:"dock"},name:"Wet Dock / Dry Dock"},"waterway/drain":{icon:"iD-waterway-ditch",fields:["structure_waterway","intermittent"],geometry:["line"],tags:{waterway:"drain"},name:"Drain"},"waterway/fuel":{icon:"maki-fuel",fields:["name","operator","address","opening_hours","fuel_multi"],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:["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:["name","structure_waterway","width","intermittent"],geometry:["line"],terms:["arroyo","beck","branch","brook","burn","course","creek","drift","flood","flow","gully","run","runnel","rush","spate","spritz","tributary","wadi","wash","watercourse"],tags:{waterway:"stream",intermittent:"yes"},reference:{key:"waterway",value:"stream"},name:"Intermittent Stream"},"waterway/stream":{icon:"iD-waterway-stream",fields:["name","structure_waterway","width","intermittent"],moreFields:["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":{name:"Banco de la Nación",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 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/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é"},removeTags:{amenity:"cafe",brand:"McCafé","brand:wikidata":"Q3114287","brand:wikipedia":"en:McCafé",cuisine:"coffee_shop",name:"McCafé"},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/Старбакс":{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/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/Enel - stazione di ricarica":{name:"Enel - stazione di ricarica",icon:"fas-charging-station",geometry:["point"],tags:{amenity:"charging_station","brand:wikidata":"Q651222"},addTags:{amenity:"charging_station",brand:"Enel - stazione di ricarica","brand:wikidata":"Q651222","brand:wikipedia":"en:Enel",name:"Enel - stazione di ricarica"},removeTags:{amenity:"charging_station",brand:"Enel - stazione di ricarica","brand:wikidata":"Q651222","brand:wikipedia":"en:Enel",name:"Enel - stazione di ricarica"},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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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":"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:wikidata":"Q11350960","brand:wikipedia":"ja:ローソンストア100",name:"ローソンストア100",shop:"convenience"},removeTags:{brand:"ローソンストア100","brand:wikidata":"Q11350960","brand:wikipedia":"ja:ローソンストア100",name:"ローソンストア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/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/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/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/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/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/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/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/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/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:"Lonblaws",shop:"supermarket"},removeTags:{brand:"Loblaws","brand:wikidata":"Q3257626","brand:wikipedia":"en:Loblaws",name:"Lonblaws",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/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/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 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 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/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":"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":"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":"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":"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":"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/惠康 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":"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"},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 enter(datum) {
31895               if (datum === _target) return;
31896               _target = datum;
31897
31898               _selection.selectAll('.hover')
31899                   .classed('hover', false);
31900               _selection.selectAll('.hover-suppressed')
31901                   .classed('hover-suppressed', false);
31902
31903               // What are we hovering over?
31904               var entity, selector;
31905               if (datum && datum.__featurehash__) {
31906                   entity = datum;
31907                   selector = '.data' + datum.__featurehash__;
31908
31909               } else if (datum instanceof qaError) {
31910                   entity = datum;
31911                   selector = '.' + datum.service + '.error_id-' + datum.id;
31912
31913               } else if (datum instanceof osmNote) {
31914                   entity = datum;
31915                   selector = '.note-' + datum.id;
31916
31917               } else if (datum instanceof osmEntity) {
31918                   entity = datum;
31919                   selector = '.' + entity.id;
31920                   if (entity.type === 'relation') {
31921                       entity.members.forEach(function(member) { selector += ', .' + member.id; });
31922                   }
31923               } else if (datum && datum.properties && (datum.properties.entity instanceof osmEntity)) {
31924                   entity = datum.properties.entity;
31925                   selector = '.' + entity.id;
31926                   if (entity.type === 'relation') {
31927                       entity.members.forEach(function(member) { selector += ', .' + member.id; });
31928                   }
31929               }
31930
31931               // Update hover state and dispatch event
31932               if (entity && entity.id !== _newNodeId) {
31933                   // If drawing a way, don't hover on a node that was just placed. #3974
31934                   var mode = context.mode() && context.mode().id;
31935                   if ((mode === 'draw-line' || mode === 'draw-area') && !_newNodeId && entity.type === 'node') {
31936                       _newNodeId = entity.id;
31937                       return;
31938                   }
31939
31940                   var suppressed = (_altDisables && event && event.altKey) ||
31941                       (entity.type === 'node' && _ignoreVertex && !context.presets().allowsVertex(entity, context.graph()));
31942                   _selection.selectAll(selector)
31943                       .classed(suppressed ? 'hover-suppressed' : 'hover', true);
31944
31945                   dispatch$1.call('hover', this, !suppressed && entity);
31946
31947               } else {
31948                   dispatch$1.call('hover', this, null);
31949               }
31950           }
31951       }
31952
31953
31954       behavior.off = function(selection) {
31955           selection.selectAll('.hover')
31956               .classed('hover', false);
31957           selection.selectAll('.hover-suppressed')
31958               .classed('hover-suppressed', false);
31959           selection
31960               .classed('hover-disabled', false);
31961
31962           selection
31963               .on('mouseover.hover', null)
31964               .on('mouseout.hover', null)
31965               .on('mousedown.hover', null);
31966
31967           select(window)
31968               .on('keydown.hover', null)
31969               .on('keyup.hover', null);
31970       };
31971
31972
31973       behavior.altDisables = function(val) {
31974           if (!arguments.length) return _altDisables;
31975           _altDisables = val;
31976           return behavior;
31977       };
31978
31979       behavior.ignoreVertex = function(val) {
31980           if (!arguments.length) return _ignoreVertex;
31981           _ignoreVertex = val;
31982           return behavior;
31983       };
31984
31985       behavior.initialNodeId = function(nodeId) {
31986           _initialNodeId = nodeId;
31987           return behavior;
31988       };
31989
31990       return utilRebind(behavior, dispatch$1, 'on');
31991   }
31992
31993   function refresh(selection, node) {
31994       var cr = node.getBoundingClientRect();
31995       var prop = [cr.width, cr.height];
31996       selection.property('__dimensions__', prop);
31997       return prop;
31998   }
31999
32000   function utilGetDimensions(selection, force) {
32001       if (!selection || selection.empty()) {
32002           return [0, 0];
32003       }
32004       var node = selection.node(),
32005           cached = selection.property('__dimensions__');
32006       return (!cached || force) ? refresh(selection, node) : cached;
32007   }
32008
32009
32010   function utilSetDimensions(selection, dimensions) {
32011       if (!selection || selection.empty()) {
32012           return selection;
32013       }
32014       var node = selection.node();
32015       if (dimensions === null) {
32016           refresh(selection, node);
32017           return selection;
32018       }
32019       return selection
32020           .property('__dimensions__', [dimensions[0], dimensions[1]])
32021           .attr('width', dimensions[0])
32022           .attr('height', dimensions[1]);
32023   }
32024
32025   function behaviorTail() {
32026       var container;
32027       var xmargin = 25;
32028       var tooltipSize = [0, 0];
32029       var selectionSize = [0, 0];
32030       var _text;
32031
32032
32033       function behavior(selection) {
32034           if (!_text) return;
32035
32036           select(window)
32037               .on('resize.tail', function() { selectionSize = utilGetDimensions(selection); });
32038
32039           container = select(document.body)
32040               .append('div')
32041               .style('display', 'none')
32042               .attr('class', 'tail tooltip-inner');
32043
32044           container.append('div')
32045               .text(_text);
32046
32047           selection
32048               .on('mousemove.tail', mousemove)
32049               .on('mouseenter.tail', mouseenter)
32050               .on('mouseleave.tail', mouseleave);
32051
32052           container
32053               .on('mousemove.tail', mousemove);
32054
32055           tooltipSize = utilGetDimensions(container);
32056           selectionSize = utilGetDimensions(selection);
32057
32058
32059           function show() {
32060               container.style('display', 'block');
32061               tooltipSize = utilGetDimensions(container);
32062           }
32063
32064
32065           function mousemove() {
32066               if (container.style('display') === 'none') show();
32067               var xoffset = ((event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
32068                   -tooltipSize[0] - xmargin : xmargin;
32069               container.classed('left', xoffset > 0);
32070               utilSetTransform(container, event.clientX + xoffset, event.clientY);
32071           }
32072
32073
32074           function mouseleave() {
32075               if (event.relatedTarget !== container.node()) {
32076                   container.style('display', 'none');
32077               }
32078           }
32079
32080
32081           function mouseenter() {
32082               if (event.relatedTarget !== container.node()) {
32083                   show();
32084               }
32085           }
32086       }
32087
32088
32089       behavior.off = function(selection) {
32090           if (!_text) return;
32091
32092           container
32093               .on('mousemove.tail', null)
32094               .remove();
32095
32096           selection
32097               .on('mousemove.tail', null)
32098               .on('mouseenter.tail', null)
32099               .on('mouseleave.tail', null);
32100
32101           select(window)
32102               .on('resize.tail', null);
32103       };
32104
32105
32106       behavior.text = function(val) {
32107           if (!arguments.length) return _text;
32108           _text = val;
32109           return behavior;
32110       };
32111
32112
32113       return behavior;
32114   }
32115
32116   var _usedTails = {};
32117   var _disableSpace = false;
32118   var _lastSpace = null;
32119
32120
32121   function behaviorDraw(context) {
32122       var dispatch$1 = dispatch(
32123           'move', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish'
32124       );
32125
32126       var keybinding = utilKeybinding('draw');
32127
32128       var _hover = behaviorHover(context).altDisables(true).ignoreVertex(true)
32129           .on('hover', context.ui().sidebar.hover);
32130       var tail = behaviorTail();
32131       var edit = behaviorEdit(context);
32132
32133       var closeTolerance = 4;
32134       var tolerance = 12;
32135       var _mouseLeave = false;
32136       var _lastMouse = null;
32137
32138
32139       // related code
32140       // - `mode/drag_node.js` `datum()`
32141       function datum() {
32142           var mode = context.mode();
32143           var isNote = mode && (mode.id.indexOf('note') !== -1);
32144           if (event.altKey || isNote) return {};
32145
32146           var element;
32147           if (event.type === 'keydown') {
32148               element = _lastMouse && _lastMouse.target;
32149           } else {
32150               element = event.target;
32151           }
32152
32153           // When drawing, snap only to touch targets..
32154           // (this excludes area fills and active drawing elements)
32155           var d = element.__data__;
32156           return (d && d.properties && d.properties.target) ? d : {};
32157       }
32158
32159
32160       function mousedown() {
32161
32162           function point() {
32163               var p = context.container().node();
32164               return touchId !== null ? d3_touches(p).filter(function(p) {
32165                   return p.identifier === touchId;
32166               })[0] : mouse(p);
32167           }
32168
32169           var element = select(this);
32170           var touchId = event.touches ? event.changedTouches[0].identifier : null;
32171           var t1 = +new Date();
32172           var p1 = point();
32173
32174           element.on('mousemove.draw', null);
32175
32176           select(window).on('mouseup.draw', function() {
32177               var t2 = +new Date();
32178               var p2 = point();
32179               var dist = geoVecLength(p1, p2);
32180
32181               element.on('mousemove.draw', mousemove);
32182               select(window).on('mouseup.draw', null);
32183
32184               if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
32185                   // Prevent a quick second click
32186                   select(window).on('click.draw-block', function() {
32187                       event.stopPropagation();
32188                   }, true);
32189
32190                   context.map().dblclickEnable(false);
32191
32192                   window.setTimeout(function() {
32193                       context.map().dblclickEnable(true);
32194                       select(window).on('click.draw-block', null);
32195                   }, 500);
32196
32197                   click();
32198               }
32199           }, true);
32200       }
32201
32202
32203       function mousemove() {
32204           _lastMouse = event;
32205           dispatch$1.call('move', this, datum());
32206       }
32207
32208
32209       function mouseenter() {
32210           _mouseLeave = false;
32211       }
32212
32213
32214       function mouseleave() {
32215           _mouseLeave = true;
32216       }
32217
32218       function allowsVertex(d) {
32219           return isEmpty(d.tags) || context.presets().allowsVertex(d, context.graph());
32220       }
32221
32222       // related code
32223       // - `mode/drag_node.js`     `doMode()`
32224       // - `behavior/draw.js`      `click()`
32225       // - `behavior/draw_way.js`  `move()`
32226       function click() {
32227           var d = datum();
32228           var target = d && d.properties && d.properties.entity;
32229
32230           if (target && target.type === 'node' && allowsVertex(target)) {   // Snap to a node
32231               dispatch$1.call('clickNode', this, target, d);
32232               return;
32233
32234           } else if (target && target.type === 'way') {   // Snap to a way
32235               var choice = geoChooseEdge(
32236                   context.childNodes(target), context.mouse(), context.projection, context.activeID()
32237               );
32238               if (choice) {
32239                   var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
32240                   dispatch$1.call('clickWay', this, choice.loc, edge, d);
32241                   return;
32242               }
32243           }
32244           dispatch$1.call('click', this, context.map().mouseCoordinates(), d);
32245       }
32246
32247
32248       function space() {
32249           event.preventDefault();
32250           event.stopPropagation();
32251
32252           var currSpace = context.mouse();
32253           if (_disableSpace && _lastSpace) {
32254               var dist = geoVecLength(_lastSpace, currSpace);
32255               if (dist > tolerance) {
32256                   _disableSpace = false;
32257               }
32258           }
32259
32260           if (_disableSpace || _mouseLeave || !_lastMouse) return;
32261
32262           // user must move mouse or release space bar to allow another click
32263           _lastSpace = currSpace;
32264           _disableSpace = true;
32265
32266           select(window).on('keyup.space-block', function() {
32267               event.preventDefault();
32268               event.stopPropagation();
32269               _disableSpace = false;
32270               select(window).on('keyup.space-block', null);
32271           });
32272
32273           click();
32274       }
32275
32276
32277       function backspace() {
32278           event.preventDefault();
32279           dispatch$1.call('undo');
32280       }
32281
32282
32283       function del() {
32284           event.preventDefault();
32285           dispatch$1.call('cancel');
32286       }
32287
32288
32289       function ret() {
32290           event.preventDefault();
32291           dispatch$1.call('finish');
32292       }
32293
32294
32295       function behavior(selection) {
32296           context.install(_hover);
32297           context.install(edit);
32298
32299           if (!context.inIntro() && !_usedTails[tail.text()]) {
32300               context.install(tail);
32301           }
32302
32303           keybinding
32304               .on('⌫', backspace)
32305               .on('⌦', del)
32306               .on('⎋', ret)
32307               .on('↩', ret)
32308               .on('space', space)
32309               .on('⌥space', space);
32310
32311           selection
32312               .on('mouseenter.draw', mouseenter)
32313               .on('mouseleave.draw', mouseleave)
32314               .on('mousedown.draw', mousedown)
32315               .on('mousemove.draw', mousemove);
32316
32317           select(document)
32318               .call(keybinding);
32319
32320           return behavior;
32321       }
32322
32323
32324       behavior.off = function(selection) {
32325           context.ui().sidebar.hover.cancel();
32326           context.uninstall(_hover);
32327           context.uninstall(edit);
32328
32329           if (!context.inIntro() && !_usedTails[tail.text()]) {
32330               context.uninstall(tail);
32331               _usedTails[tail.text()] = true;
32332           }
32333
32334           selection
32335               .on('mouseenter.draw', null)
32336               .on('mouseleave.draw', null)
32337               .on('mousedown.draw', null)
32338               .on('mousemove.draw', null);
32339
32340           select(window)
32341               .on('mouseup.draw', null);
32342               // note: keyup.space-block, click.draw-block should remain
32343
32344           select(document)
32345               .call(keybinding.unbind);
32346       };
32347
32348
32349       behavior.tail = function(_) {
32350           tail.text(_);
32351           return behavior;
32352       };
32353
32354       behavior.hover = function() {
32355           return _hover;
32356       };
32357
32358
32359       return utilRebind(behavior, dispatch$1, 'on');
32360   }
32361
32362   function modeAddArea(context) {
32363       var mode = {
32364           id: 'add-area',
32365           button: 'area',
32366           title: t('modes.add_area.title'),
32367           description: t('modes.add_area.description'),
32368           key: '3'
32369       };
32370
32371       var behavior = behaviorAddWay(context)
32372           .tail(t('modes.add_area.tail'))
32373           .on('start', start)
32374           .on('startFromWay', startFromWay)
32375           .on('startFromNode', startFromNode);
32376
32377       var defaultTags = { area: 'yes' };
32378
32379
32380       function actionClose(wayId) {
32381           return function (graph) {
32382               return graph.replace(graph.entity(wayId).close());
32383           };
32384       }
32385
32386
32387       function start(loc) {
32388           var startGraph = context.graph();
32389           var node = osmNode({ loc: loc });
32390           var way = osmWay({ tags: defaultTags });
32391
32392           context.perform(
32393               actionAddEntity(node),
32394               actionAddEntity(way),
32395               actionAddVertex(way.id, node.id),
32396               actionClose(way.id)
32397           );
32398
32399           context.enter(modeDrawArea(context, way.id, startGraph, context.graph()));
32400       }
32401
32402
32403       function startFromWay(loc, edge) {
32404           var startGraph = context.graph();
32405           var node = osmNode({ loc: loc });
32406           var way = osmWay({ tags: defaultTags });
32407
32408           context.perform(
32409               actionAddEntity(node),
32410               actionAddEntity(way),
32411               actionAddVertex(way.id, node.id),
32412               actionClose(way.id),
32413               actionAddMidpoint({ loc: loc, edge: edge }, node)
32414           );
32415
32416           context.enter(modeDrawArea(context, way.id, startGraph, context.graph()));
32417       }
32418
32419
32420       function startFromNode(node) {
32421           var startGraph = context.graph();
32422           var way = osmWay({ tags: defaultTags });
32423
32424           context.perform(
32425               actionAddEntity(way),
32426               actionAddVertex(way.id, node.id),
32427               actionClose(way.id)
32428           );
32429
32430           context.enter(modeDrawArea(context, way.id, startGraph, context.graph()));
32431       }
32432
32433
32434       mode.enter = function() {
32435           context.install(behavior);
32436       };
32437
32438
32439       mode.exit = function() {
32440           context.uninstall(behavior);
32441       };
32442
32443
32444       return mode;
32445   }
32446
32447   function modeAddLine(context) {
32448       var mode = {
32449           id: 'add-line',
32450           button: 'line',
32451           title: t('modes.add_line.title'),
32452           description: t('modes.add_line.description'),
32453           key: '2'
32454       };
32455
32456       var behavior = behaviorAddWay(context)
32457           .tail(t('modes.add_line.tail'))
32458           .on('start', start)
32459           .on('startFromWay', startFromWay)
32460           .on('startFromNode', startFromNode);
32461
32462
32463       function start(loc) {
32464           var startGraph = context.graph();
32465           var node = osmNode({ loc: loc });
32466           var way = osmWay();
32467
32468           context.perform(
32469               actionAddEntity(node),
32470               actionAddEntity(way),
32471               actionAddVertex(way.id, node.id)
32472           );
32473
32474           context.enter(modeDrawLine(context, way.id, startGraph, context.graph()));
32475       }
32476
32477
32478       function startFromWay(loc, edge) {
32479           var startGraph = context.graph();
32480           var node = osmNode({ loc: loc });
32481           var way = osmWay();
32482
32483           context.perform(
32484               actionAddEntity(node),
32485               actionAddEntity(way),
32486               actionAddVertex(way.id, node.id),
32487               actionAddMidpoint({ loc: loc, edge: edge }, node)
32488           );
32489
32490           context.enter(modeDrawLine(context, way.id, startGraph, context.graph()));
32491       }
32492
32493
32494       function startFromNode(node) {
32495           var startGraph = context.graph();
32496           var way = osmWay();
32497
32498           context.perform(
32499               actionAddEntity(way),
32500               actionAddVertex(way.id, node.id)
32501           );
32502
32503           context.enter(modeDrawLine(context, way.id, startGraph, context.graph()));
32504       }
32505
32506
32507       mode.enter = function() {
32508           context.install(behavior);
32509       };
32510
32511
32512       mode.exit = function() {
32513           context.uninstall(behavior);
32514       };
32515
32516       return mode;
32517   }
32518
32519   function modeAddPoint(context) {
32520       var mode = {
32521           id: 'add-point',
32522           button: 'point',
32523           title: t('modes.add_point.title'),
32524           description: t('modes.add_point.description'),
32525           key: '1'
32526       };
32527
32528       var behavior = behaviorDraw(context)
32529           .tail(t('modes.add_point.tail'))
32530           .on('click', add)
32531           .on('clickWay', addWay)
32532           .on('clickNode', addNode)
32533           .on('cancel', cancel)
32534           .on('finish', cancel);
32535
32536
32537       function add(loc) {
32538           var node = osmNode({ loc: loc });
32539
32540           context.perform(
32541               actionAddEntity(node),
32542               t('operations.add.annotation.point')
32543           );
32544
32545           context.enter(
32546               modeSelect(context, [node.id]).newFeature(true)
32547           );
32548       }
32549
32550
32551       function addWay(loc, edge) {
32552           var node =  osmNode();
32553
32554           context.perform(
32555               actionAddMidpoint({loc: loc, edge: edge}, node),
32556               t('operations.add.annotation.vertex')
32557           );
32558
32559           context.enter(
32560               modeSelect(context, [node.id]).newFeature(true)
32561           );
32562       }
32563
32564
32565       function addNode(node) {
32566           add(node.loc);
32567       }
32568
32569
32570       function cancel() {
32571           context.enter(modeBrowse(context));
32572       }
32573
32574
32575       mode.enter = function() {
32576           context.install(behavior);
32577       };
32578
32579
32580       mode.exit = function() {
32581           context.uninstall(behavior);
32582       };
32583
32584
32585       return mode;
32586   }
32587
32588   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"};
32589   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: \\((.+)\\)"}};
32590
32591   var tiler = utilTiler();
32592   var dispatch$1 = dispatch('loaded');
32593
32594   var _krCache;
32595   var _krZoom = 14;
32596   var _krUrlRoot = 'https://www.keepright.at/';
32597
32598   var _krRuleset = [
32599       // no 20 - multiple node on same spot - these are mostly boundaries overlapping roads
32600       30, 40, 50, 60, 70, 90, 100, 110, 120, 130, 150, 160, 170, 180,
32601       190, 191, 192, 193, 194, 195, 196, 197, 198,
32602       200, 201, 202, 203, 204, 205, 206, 207, 208, 210, 220,
32603       230, 231, 232, 270, 280, 281, 282, 283, 284, 285,
32604       290, 291, 292, 293, 294, 295, 296, 297, 298, 300, 310, 311, 312, 313,
32605       320, 350, 360, 370, 380, 390, 400, 401, 402, 410, 411, 412, 413
32606   ];
32607
32608
32609   function abortRequest(i) {
32610       if (i) {
32611           i.abort();
32612       }
32613   }
32614
32615   function abortUnwantedRequests(cache, tiles) {
32616       forEach(cache.inflightTile, function(v, k) {
32617           var wanted = find$1(tiles, function(tile) {
32618               return k === tile.id;
32619           });
32620           if (!wanted) {
32621               abortRequest(v);
32622               delete cache.inflightTile[k];
32623           }
32624       });
32625   }
32626
32627
32628   function encodeErrorRtree(d) {
32629       return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
32630   }
32631
32632
32633   // replace or remove error from rtree
32634   function updateRtree(item, replace) {
32635       _krCache.rtree.remove(item, function isEql(a, b) {
32636           return a.data.id === b.data.id;
32637       });
32638
32639       if (replace) {
32640           _krCache.rtree.insert(item);
32641       }
32642   }
32643
32644
32645   function tokenReplacements(d) {
32646       if (!(d instanceof qaError)) return;
32647
32648       var htmlRegex = new RegExp(/<\/[a-z][\s\S]*>/);
32649       var replacements = {};
32650
32651       var errorTemplate = errorTypes[d.which_type];
32652       if (!errorTemplate) {
32653           /* eslint-disable no-console */
32654           console.log('No Template: ', d.which_type);
32655           console.log('  ', d.description);
32656           /* eslint-enable no-console */
32657           return;
32658       }
32659
32660       // some descriptions are just fixed text
32661       if (!errorTemplate.regex) return;
32662
32663       // regex pattern should match description with variable details captured
32664       var errorRegex = new RegExp(errorTemplate.regex, 'i');
32665       var errorMatch = errorRegex.exec(d.description);
32666       if (!errorMatch) {
32667           /* eslint-disable no-console */
32668           console.log('Unmatched: ', d.which_type);
32669           console.log('  ', d.description);
32670           console.log('  ', errorRegex);
32671           /* eslint-enable no-console */
32672           return;
32673       }
32674
32675       for (var i = 1; i < errorMatch.length; i++) {   // skip first
32676           var capture = errorMatch[i];
32677           var idType;
32678
32679           idType = 'IDs' in errorTemplate ? errorTemplate.IDs[i-1] : '';
32680           if (idType && capture) {   // link IDs if present in the capture
32681               capture = parseError(capture, idType);
32682           } else if (htmlRegex.test(capture)) {   // escape any html in non-IDs
32683               capture = '\\' +  capture + '\\';
32684           } else {
32685               var compare = capture.toLowerCase();
32686               if (localizeStrings[compare]) {   // some replacement strings can be localized
32687                   capture = t('QA.keepRight.error_parts.' + localizeStrings[compare]);
32688               }
32689           }
32690
32691           replacements['var' + i] = capture;
32692       }
32693
32694       return replacements;
32695   }
32696
32697
32698   function parseError(capture, idType) {
32699       var compare = capture.toLowerCase();
32700       if (localizeStrings[compare]) {   // some replacement strings can be localized
32701           capture = t('QA.keepRight.error_parts.' + localizeStrings[compare]);
32702       }
32703
32704       switch (idType) {
32705           // link a string like "this node"
32706           case 'this':
32707               capture = linkErrorObject(capture);
32708               break;
32709
32710           case 'url':
32711               capture = linkURL(capture);
32712               break;
32713
32714           // link an entity ID
32715           case 'n':
32716           case 'w':
32717           case 'r':
32718               capture = linkEntity(idType + capture);
32719               break;
32720
32721           // some errors have more complex ID lists/variance
32722           case '20':
32723               capture = parse20(capture);
32724               break;
32725           case '211':
32726               capture = parse211(capture);
32727               break;
32728           case '231':
32729               capture = parse231(capture);
32730               break;
32731           case '294':
32732               capture = parse294(capture);
32733               break;
32734           case '370':
32735               capture = parse370(capture);
32736               break;
32737       }
32738
32739       return capture;
32740
32741
32742       function linkErrorObject(d) {
32743           return '<a class="error_object_link">' + d + '</a>';
32744       }
32745
32746       function linkEntity(d) {
32747           return '<a class="error_entity_link">' + d + '</a>';
32748       }
32749
32750       function linkURL(d) {
32751           return '<a class="kr_external_link" target="_blank" href="' + d + '">' + d + '</a>';
32752       }
32753
32754       // arbitrary node list of form: #ID, #ID, #ID...
32755       function parse211(capture) {
32756           var newList = [];
32757           var items = capture.split(', ');
32758
32759           items.forEach(function(item) {
32760               // ID has # at the front
32761               var id = linkEntity('n' + item.slice(1));
32762               newList.push(id);
32763           });
32764
32765           return newList.join(', ');
32766       }
32767
32768       // arbitrary way list of form: #ID(layer),#ID(layer),#ID(layer)...
32769       function parse231(capture) {
32770           var newList = [];
32771           // unfortunately 'layer' can itself contain commas, so we split on '),'
32772           var items = capture.split('),');
32773
32774           items.forEach(function(item) {
32775               var match = item.match(/\#(\d+)\((.+)\)?/);
32776               if (match !== null && match.length > 2) {
32777                   newList.push(linkEntity('w' + match[1]) + ' ' +
32778                       t('QA.keepRight.errorTypes.231.layer', { layer: match[2] })
32779                   );
32780               }
32781           });
32782
32783           return newList.join(', ');
32784       }
32785
32786       // arbitrary node/relation list of form: from node #ID,to relation #ID,to node #ID...
32787       function parse294(capture) {
32788           var newList = [];
32789           var items = capture.split(',');
32790
32791           items.forEach(function(item) {
32792               var role;
32793               var idType;
32794               var id;
32795
32796               // item of form "from/to node/relation #ID"
32797               item = item.split(' ');
32798
32799               // to/from role is more clear in quotes
32800               role = '"' + item[0] + '"';
32801
32802               // first letter of node/relation provides the type
32803               idType = item[1].slice(0,1);
32804
32805               // ID has # at the front
32806               id = item[2].slice(1);
32807               id = linkEntity(idType + id);
32808
32809               item = [role, item[1], id].join(' ');
32810               newList.push(item);
32811           });
32812
32813           return newList.join(', ');
32814       }
32815
32816       // may or may not include the string "(including the name 'name')"
32817       function parse370(capture) {
32818           if (!capture) return '';
32819
32820           var match = capture.match(/\(including the name (\'.+\')\)/);
32821           if (match !== null && match.length) {
32822               return t('QA.keepRight.errorTypes.370.including_the_name', { name: match[1] });
32823           }
32824           return '';
32825       }
32826
32827       // arbitrary node list of form: #ID,#ID,#ID...
32828       function parse20(capture) {
32829           var newList = [];
32830           var items = capture.split(',');
32831
32832           items.forEach(function(item) {
32833               // ID has # at the front
32834               var id = linkEntity('n' + item.slice(1));
32835               newList.push(id);
32836           });
32837
32838           return newList.join(', ');
32839       }
32840   }
32841
32842
32843   var serviceKeepRight = {
32844       init: function() {
32845           if (!_krCache) {
32846               this.reset();
32847           }
32848
32849           this.event = utilRebind(this, dispatch$1, 'on');
32850       },
32851
32852       reset: function() {
32853           if (_krCache) {
32854               forEach(_krCache.inflightTile, abortRequest);
32855           }
32856           _krCache = {
32857               data: {},
32858               loadedTile: {},
32859               inflightTile: {},
32860               inflightPost: {},
32861               closed: {},
32862               rtree: rbush_1()
32863           };
32864       },
32865
32866
32867       // KeepRight API:  http://osm.mueschelsoft.de/keepright/interfacing.php
32868       loadErrors: function(projection) {
32869           var options = { format: 'geojson' };
32870           var rules = _krRuleset.join();
32871
32872           // determine the needed tiles to cover the view
32873           var tiles = tiler
32874               .zoomExtent([_krZoom, _krZoom])
32875               .getTiles(projection);
32876
32877           // abort inflight requests that are no longer needed
32878           abortUnwantedRequests(_krCache, tiles);
32879
32880           // issue new requests..
32881           tiles.forEach(function(tile) {
32882               if (_krCache.loadedTile[tile.id] || _krCache.inflightTile[tile.id]) return;
32883
32884               var rect = tile.extent.rectangle();
32885               var params = assignIn({}, options, { left: rect[0], bottom: rect[3], right: rect[2], top: rect[1] });
32886               var url = _krUrlRoot + 'export.php?' + utilQsString(params) + '&ch=' + rules;
32887
32888               _krCache.inflightTile[tile.id] = d3_json(url,
32889                   function(err, data) {
32890                       delete _krCache.inflightTile[tile.id];
32891
32892                       if (err) return;
32893                       _krCache.loadedTile[tile.id] = true;
32894
32895                       if (!data.features || !data.features.length) return;
32896
32897                       data.features.forEach(function(feature) {
32898                           var loc = feature.geometry.coordinates;
32899                           var props = feature.properties;
32900
32901                           // if there is a parent, save its error type e.g.:
32902                           //  Error 191 = "highway-highway"
32903                           //  Error 190 = "intersections without junctions"  (parent)
32904                           var errorType = props.error_type;
32905                           var errorTemplate = errorTypes[errorType];
32906                           var parentErrorType = (Math.floor(errorType / 10) * 10).toString();
32907
32908                           // try to handle error type directly, fallback to parent error type.
32909                           var whichType = errorTemplate ? errorType : parentErrorType;
32910                           var whichTemplate = errorTypes[whichType];
32911
32912                           // Rewrite a few of the errors at this point..
32913                           // This is done to make them easier to linkify and translate.
32914                           switch (whichType) {
32915                               case '170':
32916                                   props.description = 'This feature has a FIXME tag: ' + props.description;
32917                                   break;
32918                               case '292':
32919                               case '293':
32920                                   props.description = props.description.replace('A turn-', 'This turn-');
32921                                   break;
32922                               case '294':
32923                               case '295':
32924                               case '296':
32925                               case '297':
32926                               case '298':
32927                                   props.description = 'This turn-restriction~' + props.description;
32928                                   break;
32929                               case '300':
32930                                   props.description = 'This highway is missing a maxspeed tag';
32931                                   break;
32932                               case '411':
32933                               case '412':
32934                               case '413':
32935                                   props.description = 'This feature~' + props.description;
32936                                   break;
32937                           }
32938
32939                           // - move markers slightly so it doesn't obscure the geometry,
32940                           // - then move markers away from other coincident markers
32941                           var coincident = false;
32942                           do {
32943                               // first time, move marker up. after that, move marker right.
32944                               var delta = coincident ? [0.00001, 0] : [0, 0.00001];
32945                               loc = geoVecAdd(loc, delta);
32946                               var bbox = geoExtent(loc).bbox();
32947                               coincident = _krCache.rtree.search(bbox).length;
32948                           } while (coincident);
32949
32950                           var d = new qaError({
32951                               // Required values
32952                               loc: loc,
32953                               service: 'keepRight',
32954                               error_type: errorType,
32955                               // Extra values for this service
32956                               id: props.error_id,
32957                               comment: props.comment || null,
32958                               description: props.description || '',
32959                               error_id: props.error_id,
32960                               which_type: whichType,
32961                               parent_error_type: parentErrorType,
32962                               severity: whichTemplate.severity || 'error',
32963                               object_id: props.object_id,
32964                               object_type: props.object_type,
32965                               schema: props.schema,
32966                               title: props.title
32967                           });
32968
32969                           d.replacements = tokenReplacements(d);
32970
32971                           _krCache.data[d.id] = d;
32972                           _krCache.rtree.insert(encodeErrorRtree(d));
32973                       });
32974
32975                       dispatch$1.call('loaded');
32976                   }
32977               );
32978           });
32979       },
32980
32981
32982       postKeepRightUpdate: function(d, callback) {
32983           if (_krCache.inflightPost[d.id]) {
32984               return callback({ message: 'Error update already inflight', status: -2 }, d);
32985           }
32986
32987           var that = this;
32988           var params = { schema: d.schema, id: d.error_id };
32989
32990           if (d.state) {
32991               params.st = d.state;
32992           }
32993           if (d.newComment !== undefined) {
32994               params.co = d.newComment;
32995           }
32996
32997           // NOTE: This throws a CORS err, but it seems successful.
32998           // We don't care too much about the response, so this is fine.
32999           var url = _krUrlRoot + 'comment.php?' + utilQsString(params);
33000           _krCache.inflightPost[d.id] = request(url)
33001               .post(function(err) {
33002                   delete _krCache.inflightPost[d.id];
33003
33004                   if (d.state === 'ignore') {   // ignore permanently (false positive)
33005                       that.removeError(d);
33006
33007                   } else if (d.state === 'ignore_t') {  // ignore temporarily (error fixed)
33008                       that.removeError(d);
33009                       _krCache.closed[d.schema + ':' + d.error_id] = true;
33010
33011                   } else {
33012                       d = that.replaceError(d.update({
33013                           comment: d.newComment,
33014                           newComment: undefined,
33015                           state: undefined
33016                       }));
33017                   }
33018
33019                   return callback(err, d);
33020               });
33021
33022       },
33023
33024
33025       // get all cached errors covering the viewport
33026       getErrors: function(projection) {
33027           var viewport = projection.clipExtent();
33028           var min = [viewport[0][0], viewport[1][1]];
33029           var max = [viewport[1][0], viewport[0][1]];
33030           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
33031
33032           return _krCache.rtree.search(bbox).map(function(d) {
33033               return d.data;
33034           });
33035       },
33036
33037
33038       // get a single error from the cache
33039       getError: function(id) {
33040           return _krCache.data[id];
33041       },
33042
33043
33044       // replace a single error in the cache
33045       replaceError: function(error) {
33046           if (!(error instanceof qaError) || !error.id) return;
33047
33048           _krCache.data[error.id] = error;
33049           updateRtree(encodeErrorRtree(error), true); // true = replace
33050           return error;
33051       },
33052
33053
33054       // remove a single error from the cache
33055       removeError: function(error) {
33056           if (!(error instanceof qaError) || !error.id) return;
33057
33058           delete _krCache.data[error.id];
33059           updateRtree(encodeErrorRtree(error), false); // false = remove
33060       },
33061
33062
33063       errorURL: function(error) {
33064           return _krUrlRoot + 'report_map.php?schema=' + error.schema + '&error=' + error.id;
33065       },
33066
33067
33068       // Get an array of errors closed during this session.
33069       // Used to populate `closed:keepright` changeset tag
33070       getClosedIDs: function() {
33071           return Object.keys(_krCache.closed).sort();
33072       }
33073
33074   };
33075
33076   var tiler$1 = utilTiler();
33077   var dispatch$2 = dispatch('loaded');
33078
33079   var _erCache;
33080   var _erZoom = 14;
33081
33082   var _impOsmUrls = {
33083       ow: 'http://directionofflow.skobbler.net/directionOfFlowService',
33084       mr: 'http://missingroads.skobbler.net/missingGeoService',
33085       tr: 'http://turnrestrictionservice.skobbler.net/turnRestrictionService'
33086   };
33087
33088   function abortRequest$1(i) {
33089       forEach(i, function(v) {
33090           if (v) {
33091               v.abort();
33092           }
33093       });
33094   }
33095
33096   function abortUnwantedRequests$1(cache, tiles) {
33097       forEach(cache.inflightTile, function(v, k) {
33098           var wanted = find$1(tiles, function(tile) {
33099               return k === tile.id;
33100           });
33101           if (!wanted) {
33102               abortRequest$1(v);
33103               delete cache.inflightTile[k];
33104           }
33105       });
33106   }
33107
33108
33109   function encodeErrorRtree$1(d) {
33110       return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
33111   }
33112
33113
33114   // replace or remove error from rtree
33115   function updateRtree$1(item, replace) {
33116       _erCache.rtree.remove(item, function isEql(a, b) {
33117           return a.data.id === b.data.id;
33118       });
33119
33120       if (replace) {
33121           _erCache.rtree.insert(item);
33122       }
33123   }
33124
33125   function linkErrorObject(d) {
33126       return '<a class="error_object_link">' + d + '</a>';
33127   }
33128
33129   function linkEntity(d) {
33130       return '<a class="error_entity_link">' + d + '</a>';
33131   }
33132
33133   function pointAverage(points) {
33134       var x = 0;
33135       var y = 0;
33136
33137       forEach(points, function(v) {
33138           x += v.lon;
33139           y += v.lat;
33140       });
33141
33142       x /= points.length;
33143       y /= points.length;
33144
33145       return [x, y];
33146   }
33147
33148   function relativeBearing(p1, p2) {
33149       var angle = Math.atan2(p2.lon - p1.lon, p2.lat - p1.lat);
33150       if (angle < 0) {
33151           angle += 2 * Math.PI;
33152       }
33153
33154       // Return degrees
33155       return angle * 180 / Math.PI;
33156   }
33157
33158   // Assuming range [0,360)
33159   function cardinalDirection(bearing) {
33160       var dir = 45 * Math.round(bearing / 45);
33161       var compass = {
33162           0: 'north',
33163           45: 'northeast',
33164           90: 'east',
33165           135: 'southeast',
33166           180: 'south',
33167           225: 'southwest',
33168           270: 'west',
33169           315: 'northwest',
33170           360: 'north'
33171       };
33172
33173       return t('QA.improveOSM.directions.' + compass[dir]);
33174   }
33175
33176   // Errors shouldn't obscure eachother
33177   function preventCoincident(loc, bumpUp) {
33178       var coincident = false;
33179       do {
33180           // first time, move marker up. after that, move marker right.
33181           var delta = coincident ? [0.00001, 0] : (bumpUp ? [0, 0.00001] : [0, 0]);
33182           loc = geoVecAdd(loc, delta);
33183           var bbox = geoExtent(loc).bbox();
33184           coincident = _erCache.rtree.search(bbox).length;
33185       } while (coincident);
33186
33187       return loc;
33188   }
33189
33190   var serviceImproveOSM = {
33191       init: function() {
33192           if (!_erCache) {
33193               this.reset();
33194           }
33195
33196           this.event = utilRebind(this, dispatch$2, 'on');
33197       },
33198
33199       reset: function() {
33200           if (_erCache) {
33201               forEach(_erCache.inflightTile, abortRequest$1);
33202           }
33203           _erCache = {
33204               data: {},
33205               loadedTile: {},
33206               inflightTile: {},
33207               inflightPost: {},
33208               closed: {},
33209               rtree: rbush_1()
33210           };
33211       },
33212
33213       loadErrors: function(projection) {
33214           var options = {
33215               client: 'iD',
33216               status: 'OPEN',
33217               zoom: '19' // Use a high zoom so that clusters aren't returned
33218           };
33219
33220           // determine the needed tiles to cover the view
33221           var tiles = tiler$1
33222               .zoomExtent([_erZoom, _erZoom])
33223               .getTiles(projection);
33224
33225           // abort inflight requests that are no longer needed
33226           abortUnwantedRequests$1(_erCache, tiles);
33227
33228           // issue new requests..
33229           tiles.forEach(function(tile) {
33230               if (_erCache.loadedTile[tile.id] || _erCache.inflightTile[tile.id]) return;
33231
33232               var rect = tile.extent.rectangle();
33233               var params = assignIn({}, options, { east: rect[0], south: rect[3], west: rect[2], north: rect[1] });
33234
33235               // 3 separate requests to store for each tile
33236               var requests = {};
33237
33238               forEach(_impOsmUrls, function(v, k) {
33239                   // We exclude WATER from missing geometry as it doesn't seem useful
33240                   // We use most confident one-way and turn restrictions only, still have false positives
33241                   var kParams = assignIn({}, params, (k === 'mr') ? { type: 'PARKING,ROAD,BOTH,PATH' } : { confidenceLevel: 'C1' });
33242                   var url = v + '/search?' + utilQsString(kParams);
33243
33244                   requests[k] = d3_json(url,
33245                       function(err, data) {
33246                           delete _erCache.inflightTile[tile.id];
33247
33248                           if (err) return;
33249                           _erCache.loadedTile[tile.id] = true;
33250
33251                           // Road segments at high zoom == oneways
33252                           if (data.roadSegments) {
33253                               data.roadSegments.forEach(function(feature) {
33254                                   // Position error at the approximate middle of the segment
33255                                   var points = feature.points;
33256                                   var mid = points.length / 2;
33257                                   var loc;
33258
33259                                   // Even number of points, find midpoint of the middle two
33260                                   // Odd number of points, use position of very middle point
33261                                   if (mid % 1 === 0) {
33262                                       loc = pointAverage([points[mid - 1], points[mid]]);
33263                                   } else {
33264                                       mid = points[Math.floor(mid)];
33265                                       loc = [mid.lon, mid.lat];
33266                                   }
33267
33268                                   // One-ways can land on same segment in opposite direction
33269                                   loc = preventCoincident(loc, false);
33270
33271                                   var d = new qaError({
33272                                       // Info required for every error
33273                                       loc: loc,
33274                                       service: 'improveOSM',
33275                                       error_type: k,
33276                                       // Extra details needed for this service
33277                                       error_key: k,
33278                                       identifier: { // this is used to post changes to the error
33279                                           wayId: feature.wayId,
33280                                           fromNodeId: feature.fromNodeId,
33281                                           toNodeId: feature.toNodeId
33282                                       },
33283                                       object_id: feature.wayId,
33284                                       object_type: 'way',
33285                                       status: feature.status
33286                                   });
33287
33288                                   // Variables used in the description
33289                                   d.replacements = {
33290                                       percentage: feature.percentOfTrips,
33291                                       num_trips: feature.numberOfTrips,
33292                                       highway: linkErrorObject(t('QA.keepRight.error_parts.highway')),
33293                                       from_node: linkEntity('n' + feature.fromNodeId),
33294                                       to_node: linkEntity('n' + feature.toNodeId)
33295                                   };
33296
33297                                   _erCache.data[d.id] = d;
33298                                   _erCache.rtree.insert(encodeErrorRtree$1(d));
33299                               });
33300                           }
33301
33302                           // Tiles at high zoom == missing roads
33303                           if (data.tiles) {
33304                               data.tiles.forEach(function(feature) {
33305                                   var geoType = feature.type.toLowerCase();
33306
33307                                   // Average of recorded points should land on the missing geometry
33308                                   // Missing geometry could happen to land on another error
33309                                   var loc = pointAverage(feature.points);
33310                                   loc = preventCoincident(loc, false);
33311
33312                                   var d = new qaError({
33313                                       // Info required for every error
33314                                       loc: loc,
33315                                       service: 'improveOSM',
33316                                       error_type: k + '-' + geoType,
33317                                       // Extra details needed for this service
33318                                       error_key: k,
33319                                       identifier: { x: feature.x, y: feature.y },
33320                                       status: feature.status
33321                                   });
33322
33323                                   d.replacements = {
33324                                       num_trips: feature.numberOfTrips,
33325                                       geometry_type: t('QA.improveOSM.geometry_types.' + geoType)
33326                                   };
33327
33328                                   // -1 trips indicates data came from a 3rd party
33329                                   if (feature.numberOfTrips === -1) {
33330                                       d.desc = t('QA.improveOSM.error_types.mr.description_alt', d.replacements);
33331                                   }
33332
33333                                   _erCache.data[d.id] = d;
33334                                   _erCache.rtree.insert(encodeErrorRtree$1(d));
33335                               });
33336                           }
33337
33338                           // Entities at high zoom == turn restrictions
33339                           if (data.entities) {
33340                               data.entities.forEach(function(feature) {
33341                                   // Turn restrictions could be missing at same junction
33342                                   // We also want to bump the error up so node is accessible
33343                                   var loc = feature.point;
33344                                   loc = preventCoincident([loc.lon, loc.lat], true);
33345
33346                                   // Elements are presented in a strange way
33347                                   var ids = feature.id.split(',');
33348                                   var from_way = ids[0];
33349                                   var via_node = ids[3];
33350                                   var to_way = ids[2].split(':')[1];
33351
33352                                   var d = new qaError({
33353                                       // Info required for every error
33354                                       loc: loc,
33355                                       service: 'improveOSM',
33356                                       error_type: k,
33357                                       // Extra details needed for this service
33358                                       error_key: k,
33359                                       identifier: feature.id,
33360                                       object_id: via_node,
33361                                       object_type: 'node',
33362                                       status: feature.status
33363                                   });
33364
33365                                   // Travel direction along from_way clarifies the turn restriction
33366                                   var p1 = feature.segments[0].points[0];
33367                                   var p2 = feature.segments[0].points[1];
33368
33369                                   var dir_of_travel = cardinalDirection(relativeBearing(p1, p2));
33370
33371                                   // Variables used in the description
33372                                   d.replacements = {
33373                                       num_passed: feature.numberOfPasses,
33374                                       num_trips: feature.segments[0].numberOfTrips,
33375                                       turn_restriction: feature.turnType.toLowerCase(),
33376                                       from_way: linkEntity('w' + from_way),
33377                                       to_way: linkEntity('w' + to_way),
33378                                       travel_direction: dir_of_travel,
33379                                       junction: linkErrorObject(t('QA.keepRight.error_parts.this_node'))
33380                                   };
33381
33382                                   _erCache.data[d.id] = d;
33383                                   _erCache.rtree.insert(encodeErrorRtree$1(d));
33384                               });
33385                           }
33386                       }
33387                   );
33388               });
33389
33390               _erCache.inflightTile[tile.id] = requests;
33391               dispatch$2.call('loaded');
33392           });
33393       },
33394
33395       getComments: function(d, callback) {
33396           // If comments already retrieved no need to do so again
33397           if (d.comments !== undefined) { return callback({}, d); }
33398
33399           var key = d.error_key;
33400           var qParams = {};
33401
33402           if (key === 'ow') {
33403               qParams = d.identifier;
33404           } else if (key === 'mr') {
33405               qParams.tileX = d.identifier.x;
33406               qParams.tileY = d.identifier.y;
33407           } else if (key === 'tr') {
33408               qParams.targetId = d.identifier;
33409           }
33410
33411           var url = _impOsmUrls[key] + '/retrieveComments?' + utilQsString(qParams);
33412
33413           var that = this;
33414           d3_json(url, function(err, data) {
33415               // comments are served newest to oldest
33416               var comments = data.comments ? data.comments.reverse() : [];
33417
33418               that.replaceError(d.update({
33419                   comments: comments
33420               }));
33421               return callback(err, d);
33422           });
33423       },
33424
33425       postUpdate: function(d, callback) {
33426           if (!services.osm.authenticated()) { // Username required in payload
33427               return callback({ message: 'Not Authenticated', status: -3}, d);
33428           }
33429           if (_erCache.inflightPost[d.id]) {
33430               return callback({ message: 'Error update already inflight', status: -2 }, d);
33431           }
33432
33433           var that = this;
33434
33435           // Payload can only be sent once username is established
33436           services.osm.userDetails(sendPayload);
33437
33438           function sendPayload(err, user) {
33439               if (err) { return callback(err, d); }
33440
33441               var key = d.error_key;
33442               var url = _impOsmUrls[key] + '/comment';
33443               var payload = {
33444                   username: user.display_name
33445               };
33446
33447               // Each error type has different data for identification
33448               if (key === 'ow') {
33449                   payload.roadSegments = [ d.identifier ];
33450               } else if (key === 'mr') {
33451                   payload.tiles = [ d.identifier ];
33452               } else if (key === 'tr') {
33453                   payload.targetIds = [ d.identifier ];
33454               }
33455
33456               if (d.newStatus !== undefined) {
33457                   payload.status = d.newStatus;
33458                   payload.text = 'status changed';
33459               }
33460
33461               // Comment take place of default text
33462               if (d.newComment !== undefined) {
33463                   payload.text = d.newComment;
33464               }
33465
33466               _erCache.inflightPost[d.id] = request(url)
33467                   .header('Content-Type', 'application/json')
33468                   .post(JSON.stringify(payload), function(err) {
33469                       delete _erCache.inflightPost[d.id];
33470
33471                       // Unsuccessful response status, keep issue open
33472                       if (err.status !== 200) { return callback(err, d); }
33473
33474                       // Just a comment, update error in cache
33475                       if (d.newStatus === undefined) {
33476                           var now = new Date();
33477                           var comments = d.comments ? d.comments : [];
33478
33479                           comments.push({
33480                               username: payload.username,
33481                               text: payload.text,
33482                               timestamp: now.getTime() / 1000
33483                           });
33484
33485                           that.replaceError(d.update({
33486                               comments: comments,
33487                               newComment: undefined
33488                           }));
33489                       } else {
33490                           that.removeError(d);
33491
33492                           if (d.newStatus === 'SOLVED') {
33493                               // No pretty identifier, so we just use coordinates
33494                               var closedID = d.loc[1].toFixed(5) + '/' + d.loc[0].toFixed(5);
33495                               _erCache.closed[key + ':' + closedID] = true;
33496                           }
33497                       }
33498
33499                       return callback(err, d);
33500                   });
33501           }
33502       },
33503
33504       // get all cached errors covering the viewport
33505       getErrors: function(projection) {
33506           var viewport = projection.clipExtent();
33507           var min = [viewport[0][0], viewport[1][1]];
33508           var max = [viewport[1][0], viewport[0][1]];
33509           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
33510
33511           return _erCache.rtree.search(bbox).map(function(d) {
33512               return d.data;
33513           });
33514       },
33515
33516       // get a single error from the cache
33517       getError: function(id) {
33518           return _erCache.data[id];
33519       },
33520
33521       // replace a single error in the cache
33522       replaceError: function(error) {
33523           if (!(error instanceof qaError) || !error.id) return;
33524
33525           _erCache.data[error.id] = error;
33526           updateRtree$1(encodeErrorRtree$1(error), true); // true = replace
33527           return error;
33528       },
33529
33530       // remove a single error from the cache
33531       removeError: function(error) {
33532           if (!(error instanceof qaError) || !error.id) return;
33533
33534           delete _erCache.data[error.id];
33535           updateRtree$1(encodeErrorRtree$1(error), false); // false = remove
33536       },
33537
33538       // Used to populate `closed:improveosm` changeset tag
33539       getClosedIDs: function() {
33540           return Object.keys(_erCache.closed).sort();
33541       }
33542   };
33543
33544   function svgAreas(projection, context) {
33545       // Patterns only work in Firefox when set directly on element.
33546       // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
33547       var patterns = {
33548           // tag - pattern name
33549           // -or-
33550           // tag - value - pattern name
33551           // -or-
33552           // tag - value - rules (optional tag-values, pattern name)
33553           // (matches earlier rules first, so fallback should be last entry)
33554           amenity: {
33555               grave_yard: 'cemetery',
33556               fountain: 'water_standing'
33557           },
33558           landuse: {
33559               cemetery: [
33560                   { religion: 'christian', pattern: 'cemetery_christian' },
33561                   { religion: 'buddhist', pattern: 'cemetery_buddhist' },
33562                   { religion: 'muslim', pattern: 'cemetery_muslim' },
33563                   { religion: 'jewish', pattern: 'cemetery_jewish' },
33564                   { pattern: 'cemetery' }
33565               ],
33566               construction: 'construction',
33567               farmland: 'farmland',
33568               farmyard: 'farmyard',
33569               forest: [
33570                   { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
33571                   { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
33572                   { leaf_type: 'leafless', pattern: 'forest_leafless' },
33573                   { pattern: 'forest' } // same as 'leaf_type:mixed'
33574               ],
33575               grave_yard: 'cemetery',
33576               grass: 'grass',
33577               landfill: 'landfill',
33578               meadow: 'meadow',
33579               military: 'construction',
33580               orchard: 'orchard',
33581               reservoir: 'water_standing',
33582               quarry: 'quarry',
33583               vineyard: 'vineyard'
33584           },
33585           natural: {
33586               beach: 'beach',
33587               grassland: 'grass',
33588               sand: 'beach',
33589               scrub: 'scrub',
33590               water: [
33591                   { water: 'pond', pattern: 'pond' },
33592                   { water: 'reservoir', pattern: 'water_standing' },
33593                   { pattern: 'waves' }
33594               ],
33595               wetland: [
33596                   { wetland: 'marsh', pattern: 'wetland_marsh' },
33597                   { wetland: 'swamp', pattern: 'wetland_swamp' },
33598                   { wetland: 'bog', pattern: 'wetland_bog' },
33599                   { wetland: 'reedbed', pattern: 'wetland_reedbed' },
33600                   { pattern: 'wetland' }
33601               ],
33602               wood: [
33603                   { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
33604                   { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
33605                   { leaf_type: 'leafless', pattern: 'forest_leafless' },
33606                   { pattern: 'forest' } // same as 'leaf_type:mixed'
33607               ]
33608           },
33609           traffic_calming: {
33610               island: [
33611                   { surface: 'grass', pattern: 'grass' },
33612               ],
33613               chicane: [
33614                   { surface: 'grass', pattern: 'grass' },
33615               ],
33616               choker: [
33617                   { surface: 'grass', pattern: 'grass' },
33618               ]
33619           }
33620       };
33621
33622       function setPattern(entity) {
33623           // Skip pattern filling if this is a building (buildings don't get patterns applied)
33624           if (entity.tags.building && entity.tags.building !== 'no') {
33625               this.style.fill = this.style.stroke = '';
33626               return;
33627           }
33628
33629           for (var tag in patterns) {
33630               var entityValue = entity.tags[tag];
33631               if (!entityValue) continue;
33632
33633               if (typeof patterns[tag] === 'string') { // extra short syntax (just tag) - pattern name
33634                   this.style.fill = this.style.stroke = 'url("#pattern-' + patterns[tag] + '")';
33635                   return;
33636               } else {
33637                   var values = patterns[tag];
33638                   for (var value in values) {
33639                       if (entityValue !== value) continue;
33640
33641                       var rules = values[value];
33642                       if (typeof rules === 'string') { // short syntax - pattern name
33643                           this.style.fill = this.style.stroke = 'url("#pattern-' + rules + '")';
33644                           return;
33645                       } else { // long syntax - rule array
33646                           for (var ruleKey in rules) {
33647                               var rule = rules[ruleKey];
33648
33649                               var pass = true;
33650                               for (var criterion in rule) {
33651                                   if (criterion !== 'pattern') { // reserved for pattern name
33652                                       // The only rule is a required tag-value pair
33653                                       var v = entity.tags[criterion];
33654                                       if (!v || v !== rule[criterion]) {
33655                                           pass = false;
33656                                           break;
33657                                       }
33658                                   }
33659                               }
33660
33661                               if (pass) {
33662                                   this.style.fill = this.style.stroke = 'url("#pattern-' + rule.pattern + '")';
33663                                   return;
33664                               }
33665                           }
33666                       }
33667                   }
33668               }
33669           }
33670
33671           this.style.fill = this.style.stroke = '';
33672       }
33673
33674
33675       function drawTargets(selection, graph, entities, filter) {
33676           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
33677           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
33678           var getPath = svgPath(projection).geojson;
33679           var activeID = context.activeID();
33680
33681           // The targets and nopes will be MultiLineString sub-segments of the ways
33682           var data = { targets: [], nopes: [] };
33683
33684           entities.forEach(function(way) {
33685               var features = svgSegmentWay(way, graph, activeID);
33686               data.targets.push.apply(data.targets, features.passive);
33687               data.nopes.push.apply(data.nopes, features.active);
33688           });
33689
33690
33691           // Targets allow hover and vertex snapping
33692           var targetData = data.targets.filter(getPath);
33693           var targets = selection.selectAll('.area.target-allowed')
33694               .filter(function(d) { return filter(d.properties.entity); })
33695               .data(targetData, function key(d) { return d.id; });
33696
33697           // exit
33698           targets.exit()
33699               .remove();
33700
33701           // enter/update
33702           targets.enter()
33703               .append('path')
33704               .merge(targets)
33705               .attr('d', getPath)
33706               .attr('class', function(d) { return 'way area target target-allowed ' + targetClass + d.id; });
33707
33708
33709           // NOPE
33710           var nopeData = data.nopes.filter(getPath);
33711           var nopes = selection.selectAll('.area.target-nope')
33712               .filter(function(d) { return filter(d.properties.entity); })
33713               .data(nopeData, function key(d) { return d.id; });
33714
33715           // exit
33716           nopes.exit()
33717               .remove();
33718
33719           // enter/update
33720           nopes.enter()
33721               .append('path')
33722               .merge(nopes)
33723               .attr('d', getPath)
33724               .attr('class', function(d) { return 'way area target target-nope ' + nopeClass + d.id; });
33725       }
33726
33727
33728       function drawAreas(selection, graph, entities, filter) {
33729           var path = svgPath(projection, graph, true);
33730           var areas = {};
33731           var multipolygon;
33732
33733           for (var i = 0; i < entities.length; i++) {
33734               var entity = entities[i];
33735               if (entity.geometry(graph) !== 'area') continue;
33736
33737               multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
33738               if (multipolygon) {
33739                   areas[multipolygon.id] = {
33740                       entity: multipolygon.mergeTags(entity.tags),
33741                       area: Math.abs(entity.area(graph))
33742                   };
33743               } else if (!areas[entity.id]) {
33744                   areas[entity.id] = {
33745                       entity: entity,
33746                       area: Math.abs(entity.area(graph))
33747                   };
33748               }
33749           }
33750
33751           areas = values$1(areas).filter(function hasPath(a) { return path(a.entity); });
33752           areas.sort(function areaSort(a, b) { return b.area - a.area; });
33753           areas = map$3(areas, 'entity');
33754
33755           var strokes = areas.filter(function(area) {
33756               return area.type === 'way';
33757           });
33758
33759           var data = {
33760               clip: areas,
33761               shadow: strokes,
33762               stroke: strokes,
33763               fill: areas
33764           };
33765
33766           var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath-osm')
33767              .filter(filter)
33768              .data(data.clip, osmEntity.key);
33769
33770           clipPaths.exit()
33771              .remove();
33772
33773           var clipPathsEnter = clipPaths.enter()
33774              .append('clipPath')
33775              .attr('class', 'clipPath-osm')
33776              .attr('id', function(entity) { return entity.id + '-clippath'; });
33777
33778           clipPathsEnter
33779              .append('path');
33780
33781           clipPaths.merge(clipPathsEnter)
33782              .selectAll('path')
33783              .attr('d', path);
33784
33785
33786           var drawLayer = selection.selectAll('.layer-osm.areas');
33787           var touchLayer = selection.selectAll('.layer-touch.areas');
33788
33789           // Draw areas..
33790           var areagroup = drawLayer
33791               .selectAll('g.areagroup')
33792               .data(['fill', 'shadow', 'stroke']);
33793
33794           areagroup = areagroup.enter()
33795               .append('g')
33796               .attr('class', function(d) { return 'areagroup area-' + d; })
33797               .merge(areagroup);
33798
33799           var paths = areagroup
33800               .selectAll('path')
33801               .filter(filter)
33802               .data(function(layer) { return data[layer]; }, osmEntity.key);
33803
33804           paths.exit()
33805               .remove();
33806
33807           var fills = selection.selectAll('.area-fill path.area').nodes();
33808
33809           var bisect = bisector(function(node) {
33810               return -node.__data__.area(graph);
33811           }).left;
33812
33813           function sortedByArea(entity) {
33814               if (this._parent.__data__ === 'fill') {
33815                   return fills[bisect(fills, -entity.area(graph))];
33816               }
33817           }
33818
33819           paths = paths.enter()
33820               .insert('path', sortedByArea)
33821               .merge(paths)
33822               .each(function(entity) {
33823                   var layer = this.parentNode.__data__;
33824                   this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
33825
33826                   if (layer === 'fill') {
33827                       this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
33828                       setPattern.call(this, entity);
33829                   }
33830               })
33831               .call(svgTagClasses())
33832               .attr('d', path);
33833
33834
33835           // Draw touch targets..
33836           touchLayer
33837               .call(drawTargets, graph, data.stroke, filter);
33838       }
33839
33840       return drawAreas;
33841   }
33842
33843   /**
33844    * A specialized version of `_.reduce` for arrays without support for
33845    * iteratee shorthands.
33846    *
33847    * @private
33848    * @param {Array} [array] The array to iterate over.
33849    * @param {Function} iteratee The function invoked per iteration.
33850    * @param {*} [accumulator] The initial value.
33851    * @param {boolean} [initAccum] Specify using the first element of `array` as
33852    *  the initial value.
33853    * @returns {*} Returns the accumulated value.
33854    */
33855   function arrayReduce(array, iteratee, accumulator, initAccum) {
33856     var index = -1,
33857         length = array == null ? 0 : array.length;
33858
33859     if (initAccum && length) {
33860       accumulator = array[++index];
33861     }
33862     while (++index < length) {
33863       accumulator = iteratee(accumulator, array[index], index, array);
33864     }
33865     return accumulator;
33866   }
33867
33868   /**
33869    * The base implementation of `_.reduce` and `_.reduceRight`, without support
33870    * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
33871    *
33872    * @private
33873    * @param {Array|Object} collection The collection to iterate over.
33874    * @param {Function} iteratee The function invoked per iteration.
33875    * @param {*} accumulator The initial value.
33876    * @param {boolean} initAccum Specify using the first or last element of
33877    *  `collection` as the initial value.
33878    * @param {Function} eachFunc The function to iterate over `collection`.
33879    * @returns {*} Returns the accumulated value.
33880    */
33881   function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
33882     eachFunc(collection, function(value, index, collection) {
33883       accumulator = initAccum
33884         ? (initAccum = false, value)
33885         : iteratee(accumulator, value, index, collection);
33886     });
33887     return accumulator;
33888   }
33889
33890   /**
33891    * Reduces `collection` to a value which is the accumulated result of running
33892    * each element in `collection` thru `iteratee`, where each successive
33893    * invocation is supplied the return value of the previous. If `accumulator`
33894    * is not given, the first element of `collection` is used as the initial
33895    * value. The iteratee is invoked with four arguments:
33896    * (accumulator, value, index|key, collection).
33897    *
33898    * Many lodash methods are guarded to work as iteratees for methods like
33899    * `_.reduce`, `_.reduceRight`, and `_.transform`.
33900    *
33901    * The guarded methods are:
33902    * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
33903    * and `sortBy`
33904    *
33905    * @static
33906    * @memberOf _
33907    * @since 0.1.0
33908    * @category Collection
33909    * @param {Array|Object} collection The collection to iterate over.
33910    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
33911    * @param {*} [accumulator] The initial value.
33912    * @returns {*} Returns the accumulated value.
33913    * @see _.reduceRight
33914    * @example
33915    *
33916    * _.reduce([1, 2], function(sum, n) {
33917    *   return sum + n;
33918    * }, 0);
33919    * // => 3
33920    *
33921    * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
33922    *   (result[value] || (result[value] = [])).push(key);
33923    *   return result;
33924    * }, {});
33925    * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
33926    */
33927   function reduce(collection, iteratee, accumulator) {
33928     var func = isArray(collection) ? arrayReduce : baseReduce,
33929         initAccum = arguments.length < 3;
33930
33931     return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);
33932   }
33933
33934   /** Error message constants. */
33935   var FUNC_ERROR_TEXT$3 = 'Expected a function';
33936
33937   /**
33938    * Creates a throttled function that only invokes `func` at most once per
33939    * every `wait` milliseconds. The throttled function comes with a `cancel`
33940    * method to cancel delayed `func` invocations and a `flush` method to
33941    * immediately invoke them. Provide `options` to indicate whether `func`
33942    * should be invoked on the leading and/or trailing edge of the `wait`
33943    * timeout. The `func` is invoked with the last arguments provided to the
33944    * throttled function. Subsequent calls to the throttled function return the
33945    * result of the last `func` invocation.
33946    *
33947    * **Note:** If `leading` and `trailing` options are `true`, `func` is
33948    * invoked on the trailing edge of the timeout only if the throttled function
33949    * is invoked more than once during the `wait` timeout.
33950    *
33951    * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
33952    * until to the next tick, similar to `setTimeout` with a timeout of `0`.
33953    *
33954    * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
33955    * for details over the differences between `_.throttle` and `_.debounce`.
33956    *
33957    * @static
33958    * @memberOf _
33959    * @since 0.1.0
33960    * @category Function
33961    * @param {Function} func The function to throttle.
33962    * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
33963    * @param {Object} [options={}] The options object.
33964    * @param {boolean} [options.leading=true]
33965    *  Specify invoking on the leading edge of the timeout.
33966    * @param {boolean} [options.trailing=true]
33967    *  Specify invoking on the trailing edge of the timeout.
33968    * @returns {Function} Returns the new throttled function.
33969    * @example
33970    *
33971    * // Avoid excessively updating the position while scrolling.
33972    * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
33973    *
33974    * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
33975    * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
33976    * jQuery(element).on('click', throttled);
33977    *
33978    * // Cancel the trailing throttled invocation.
33979    * jQuery(window).on('popstate', throttled.cancel);
33980    */
33981   function throttle(func, wait, options) {
33982     var leading = true,
33983         trailing = true;
33984
33985     if (typeof func != 'function') {
33986       throw new TypeError(FUNC_ERROR_TEXT$3);
33987     }
33988     if (isObject(options)) {
33989       leading = 'leading' in options ? !!options.leading : leading;
33990       trailing = 'trailing' in options ? !!options.trailing : trailing;
33991     }
33992     return debounce(func, wait, {
33993       'leading': leading,
33994       'maxWait': wait,
33995       'trailing': trailing
33996     });
33997   }
33998
33999   var fastJsonStableStringify = function (data, opts) {
34000       if (!opts) opts = {};
34001       if (typeof opts === 'function') opts = { cmp: opts };
34002       var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;
34003
34004       var cmp = opts.cmp && (function (f) {
34005           return function (node) {
34006               return function (a, b) {
34007                   var aobj = { key: a, value: node[a] };
34008                   var bobj = { key: b, value: node[b] };
34009                   return f(aobj, bobj);
34010               };
34011           };
34012       })(opts.cmp);
34013
34014       var seen = [];
34015       return (function stringify (node) {
34016           if (node && node.toJSON && typeof node.toJSON === 'function') {
34017               node = node.toJSON();
34018           }
34019
34020           if (node === undefined) return;
34021           if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';
34022           if (typeof node !== 'object') return JSON.stringify(node);
34023
34024           var i, out;
34025           if (Array.isArray(node)) {
34026               out = '[';
34027               for (i = 0; i < node.length; i++) {
34028                   if (i) out += ',';
34029                   out += stringify(node[i]) || 'null';
34030               }
34031               return out + ']';
34032           }
34033
34034           if (node === null) return 'null';
34035
34036           if (seen.indexOf(node) !== -1) {
34037               if (cycles) return JSON.stringify('__cycle__');
34038               throw new TypeError('Converting circular structure to JSON');
34039           }
34040
34041           var seenIndex = seen.push(node) - 1;
34042           var keys = Object.keys(node).sort(cmp && cmp(node));
34043           out = '';
34044           for (i = 0; i < keys.length; i++) {
34045               var key = keys[i];
34046               var value = stringify(node[key]);
34047
34048               if (!value) continue;
34049               if (out) out += ',';
34050               out += JSON.stringify(key) + ':' + value;
34051           }
34052           seen.splice(seenIndex, 1);
34053           return '{' + out + '}';
34054       })(data);
34055   };
34056
34057   //[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]
34058   //[4a]        NameChar           ::=          NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
34059   //[5]         Name       ::=          NameStartChar (NameChar)*
34060   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
34061   var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
34062   var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
34063   //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
34064   //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(',')
34065
34066   //S_TAG,      S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
34067   //S_ATTR_SPACE,       S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
34068   var S_TAG = 0;//tag name offerring
34069   var S_ATTR = 1;//attr name offerring 
34070   var S_ATTR_SPACE=2;//attr name end and space offer
34071   var S_EQ = 3;//=space?
34072   var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
34073   var S_ATTR_END = 5;//attr value end and no space(quot end)
34074   var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
34075   var S_TAG_CLOSE = 7;//closed el<el />
34076
34077   function XMLReader(){
34078         
34079   }
34080
34081   XMLReader.prototype = {
34082         parse:function(source,defaultNSMap,entityMap){
34083                 var domBuilder = this.domBuilder;
34084                 domBuilder.startDocument();
34085                 _copy(defaultNSMap ,defaultNSMap = {});
34086                 parse(source,defaultNSMap,entityMap,
34087                                 domBuilder,this.errorHandler);
34088                 domBuilder.endDocument();
34089         }
34090   };
34091   function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
34092         function fixedFromCharCode(code) {
34093                 // String.prototype.fromCharCode does not supports
34094                 // > 2 bytes unicode chars directly
34095                 if (code > 0xffff) {
34096                         code -= 0x10000;
34097                         var surrogate1 = 0xd800 + (code >> 10)
34098                                 , surrogate2 = 0xdc00 + (code & 0x3ff);
34099
34100                         return String.fromCharCode(surrogate1, surrogate2);
34101                 } else {
34102                         return String.fromCharCode(code);
34103                 }
34104         }
34105         function entityReplacer(a){
34106                 var k = a.slice(1,-1);
34107                 if(k in entityMap){
34108                         return entityMap[k]; 
34109                 }else if(k.charAt(0) === '#'){
34110                         return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
34111                 }else{
34112                         errorHandler.error('entity not found:'+a);
34113                         return a;
34114                 }
34115         }
34116         function appendText(end){//has some bugs
34117                 if(end>start){
34118                         var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
34119                         locator&&position(start);
34120                         domBuilder.characters(xt,0,end-start);
34121                         start = end;
34122                 }
34123         }
34124         function position(p,m){
34125                 while(p>=lineEnd && (m = linePattern.exec(source))){
34126                         lineStart = m.index;
34127                         lineEnd = lineStart + m[0].length;
34128                         locator.lineNumber++;
34129                         //console.log('line++:',locator,startPos,endPos)
34130                 }
34131                 locator.columnNumber = p-lineStart+1;
34132         }
34133         var lineStart = 0;
34134         var lineEnd = 0;
34135         var linePattern = /.*(?:\r\n?|\n)|.*$/g;
34136         var locator = domBuilder.locator;
34137         
34138         var parseStack = [{currentNSMap:defaultNSMapCopy}];
34139         var closeMap = {};
34140         var start = 0;
34141         while(true){
34142                 try{
34143                         var tagStart = source.indexOf('<',start);
34144                         if(tagStart<0){
34145                                 if(!source.substr(start).match(/^\s*$/)){
34146                                         var doc = domBuilder.doc;
34147                                 var text = doc.createTextNode(source.substr(start));
34148                                 doc.appendChild(text);
34149                                 domBuilder.currentElement = text;
34150                                 }
34151                                 return;
34152                         }
34153                         if(tagStart>start){
34154                                 appendText(tagStart);
34155                         }
34156                         switch(source.charAt(tagStart+1)){
34157                         case '/':
34158                                 var end = source.indexOf('>',tagStart+3);
34159                                 var tagName = source.substring(tagStart+2,end);
34160                                 var config = parseStack.pop();
34161                                 if(end<0){
34162                                         
34163                                 tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
34164                                 //console.error('#@@@@@@'+tagName)
34165                                 errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
34166                                 end = tagStart+1+tagName.length;
34167                         }else if(tagName.match(/\s</)){
34168                                 tagName = tagName.replace(/[\s<].*/,'');
34169                                 errorHandler.error("end tag name: "+tagName+' maybe not complete');
34170                                 end = tagStart+1+tagName.length;
34171                                 }
34172                                 //console.error(parseStack.length,parseStack)
34173                                 //console.error(config);
34174                                 var localNSMap = config.localNSMap;
34175                                 var endMatch = config.tagName == tagName;
34176                                 var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase();
34177                         if(endIgnoreCaseMach){
34178                                 domBuilder.endElement(config.uri,config.localName,tagName);
34179                                         if(localNSMap){
34180                                                 for(var prefix in localNSMap){
34181                                                         domBuilder.endPrefixMapping(prefix) ;
34182                                                 }
34183                                         }
34184                                         if(!endMatch){
34185                                 errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
34186                                         }
34187                         }else{
34188                                 parseStack.push(config);
34189                         }
34190                                 
34191                                 end++;
34192                                 break;
34193                                 // end elment
34194                         case '?':// <?...?>
34195                                 locator&&position(tagStart);
34196                                 end = parseInstruction(source,tagStart,domBuilder);
34197                                 break;
34198                         case '!':// <!doctype,<![CDATA,<!--
34199                                 locator&&position(tagStart);
34200                                 end = parseDCC(source,tagStart,domBuilder,errorHandler);
34201                                 break;
34202                         default:
34203                                 locator&&position(tagStart);
34204                                 var el = new ElementAttributes();
34205                                 var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
34206                                 //elStartEnd
34207                                 var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
34208                                 var len = el.length;
34209                                 
34210                                 
34211                                 if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
34212                                         el.closed = true;
34213                                         if(!entityMap.nbsp){
34214                                                 errorHandler.warning('unclosed xml attribute');
34215                                         }
34216                                 }
34217                                 if(locator && len){
34218                                         var locator2 = copyLocator(locator,{});
34219                                         //try{//attribute position fixed
34220                                         for(var i = 0;i<len;i++){
34221                                                 var a = el[i];
34222                                                 position(a.offset);
34223                                                 a.locator = copyLocator(locator,{});
34224                                         }
34225                                         //}catch(e){console.error('@@@@@'+e)}
34226                                         domBuilder.locator = locator2;
34227                                         if(appendElement(el,domBuilder,currentNSMap)){
34228                                                 parseStack.push(el);
34229                                         }
34230                                         domBuilder.locator = locator;
34231                                 }else{
34232                                         if(appendElement(el,domBuilder,currentNSMap)){
34233                                                 parseStack.push(el);
34234                                         }
34235                                 }
34236                                 
34237                                 
34238                                 
34239                                 if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
34240                                         end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
34241                                 }else{
34242                                         end++;
34243                                 }
34244                         }
34245                 }catch(e){
34246                         errorHandler.error('element parse error: '+e);
34247                         //errorHandler.error('element parse error: '+e);
34248                         end = -1;
34249                         //throw e;
34250                 }
34251                 if(end>start){
34252                         start = end;
34253                 }else{
34254                         //TODO: 这里有可能sax回退,有位置错误风险
34255                         appendText(Math.max(tagStart,start)+1);
34256                 }
34257         }
34258   }
34259   function copyLocator(f,t){
34260         t.lineNumber = f.lineNumber;
34261         t.columnNumber = f.columnNumber;
34262         return t;
34263   }
34264
34265   /**
34266    * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
34267    * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
34268    */
34269   function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
34270         var attrName;
34271         var value;
34272         var p = ++start;
34273         var s = S_TAG;//status
34274         while(true){
34275                 var c = source.charAt(p);
34276                 switch(c){
34277                 case '=':
34278                         if(s === S_ATTR){//attrName
34279                                 attrName = source.slice(start,p);
34280                                 s = S_EQ;
34281                         }else if(s === S_ATTR_SPACE){
34282                                 s = S_EQ;
34283                         }else{
34284                                 //fatalError: equal must after attrName or space after attrName
34285                                 throw new Error('attribute equal must after attrName');
34286                         }
34287                         break;
34288                 case '\'':
34289                 case '"':
34290                         if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
34291                                 ){//equal
34292                                 if(s === S_ATTR){
34293                                         errorHandler.warning('attribute value must after "="');
34294                                         attrName = source.slice(start,p);
34295                                 }
34296                                 start = p+1;
34297                                 p = source.indexOf(c,start);
34298                                 if(p>0){
34299                                         value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
34300                                         el.add(attrName,value,start-1);
34301                                         s = S_ATTR_END;
34302                                 }else{
34303                                         //fatalError: no end quot match
34304                                         throw new Error('attribute value no end \''+c+'\' match');
34305                                 }
34306                         }else if(s == S_ATTR_NOQUOT_VALUE){
34307                                 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
34308                                 //console.log(attrName,value,start,p)
34309                                 el.add(attrName,value,start);
34310                                 //console.dir(el)
34311                                 errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
34312                                 start = p+1;
34313                                 s = S_ATTR_END;
34314                         }else{
34315                                 //fatalError: no equal before
34316                                 throw new Error('attribute value must after "="');
34317                         }
34318                         break;
34319                 case '/':
34320                         switch(s){
34321                         case S_TAG:
34322                                 el.setTagName(source.slice(start,p));
34323                         case S_ATTR_END:
34324                         case S_TAG_SPACE:
34325                         case S_TAG_CLOSE:
34326                                 s =S_TAG_CLOSE;
34327                                 el.closed = true;
34328                         case S_ATTR_NOQUOT_VALUE:
34329                         case S_ATTR:
34330                         case S_ATTR_SPACE:
34331                                 break;
34332                         //case S_EQ:
34333                         default:
34334                                 throw new Error("attribute invalid close char('/')")
34335                         }
34336                         break;
34337                 case ''://end document
34338                         //throw new Error('unexpected end of input')
34339                         errorHandler.error('unexpected end of input');
34340                         if(s == S_TAG){
34341                                 el.setTagName(source.slice(start,p));
34342                         }
34343                         return p;
34344                 case '>':
34345                         switch(s){
34346                         case S_TAG:
34347                                 el.setTagName(source.slice(start,p));
34348                         case S_ATTR_END:
34349                         case S_TAG_SPACE:
34350                         case S_TAG_CLOSE:
34351                                 break;//normal
34352                         case S_ATTR_NOQUOT_VALUE://Compatible state
34353                         case S_ATTR:
34354                                 value = source.slice(start,p);
34355                                 if(value.slice(-1) === '/'){
34356                                         el.closed  = true;
34357                                         value = value.slice(0,-1);
34358                                 }
34359                         case S_ATTR_SPACE:
34360                                 if(s === S_ATTR_SPACE){
34361                                         value = attrName;
34362                                 }
34363                                 if(s == S_ATTR_NOQUOT_VALUE){
34364                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
34365                                         el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
34366                                 }else{
34367                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
34368                                                 errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
34369                                         }
34370                                         el.add(value,value,start);
34371                                 }
34372                                 break;
34373                         case S_EQ:
34374                                 throw new Error('attribute value missed!!');
34375                         }
34376   //                    console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
34377                         return p;
34378                 /*xml space '\x20' | #x9 | #xD | #xA; */
34379                 case '\u0080':
34380                         c = ' ';
34381                 default:
34382                         if(c<= ' '){//space
34383                                 switch(s){
34384                                 case S_TAG:
34385                                         el.setTagName(source.slice(start,p));//tagName
34386                                         s = S_TAG_SPACE;
34387                                         break;
34388                                 case S_ATTR:
34389                                         attrName = source.slice(start,p);
34390                                         s = S_ATTR_SPACE;
34391                                         break;
34392                                 case S_ATTR_NOQUOT_VALUE:
34393                                         var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
34394                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
34395                                         el.add(attrName,value,start);
34396                                 case S_ATTR_END:
34397                                         s = S_TAG_SPACE;
34398                                         break;
34399                                 //case S_TAG_SPACE:
34400                                 //case S_EQ:
34401                                 //case S_ATTR_SPACE:
34402                                 //      void();break;
34403                                 //case S_TAG_CLOSE:
34404                                         //ignore warning
34405                                 }
34406                         }else{//not space
34407   //S_TAG,      S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
34408   //S_ATTR_SPACE,       S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
34409                                 switch(s){
34410                                 //case S_TAG:void();break;
34411                                 //case S_ATTR:void();break;
34412                                 //case S_ATTR_NOQUOT_VALUE:void();break;
34413                                 case S_ATTR_SPACE:
34414                                         var tagName =  el.tagName;
34415                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
34416                                                 errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!');
34417                                         }
34418                                         el.add(attrName,attrName,start);
34419                                         start = p;
34420                                         s = S_ATTR;
34421                                         break;
34422                                 case S_ATTR_END:
34423                                         errorHandler.warning('attribute space is required"'+attrName+'"!!');
34424                                 case S_TAG_SPACE:
34425                                         s = S_ATTR;
34426                                         start = p;
34427                                         break;
34428                                 case S_EQ:
34429                                         s = S_ATTR_NOQUOT_VALUE;
34430                                         start = p;
34431                                         break;
34432                                 case S_TAG_CLOSE:
34433                                         throw new Error("elements closed character '/' and '>' must be connected to");
34434                                 }
34435                         }
34436                 }//end outer switch
34437                 //console.log('p++',p)
34438                 p++;
34439         }
34440   }
34441   /**
34442    * @return true if has new namespace define
34443    */
34444   function appendElement(el,domBuilder,currentNSMap){
34445         var tagName = el.tagName;
34446         var localNSMap = null;
34447         //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
34448         var i = el.length;
34449         while(i--){
34450                 var a = el[i];
34451                 var qName = a.qName;
34452                 var value = a.value;
34453                 var nsp = qName.indexOf(':');
34454                 if(nsp>0){
34455                         var prefix = a.prefix = qName.slice(0,nsp);
34456                         var localName = qName.slice(nsp+1);
34457                         var nsPrefix = prefix === 'xmlns' && localName;
34458                 }else{
34459                         localName = qName;
34460                         prefix = null;
34461                         nsPrefix = qName === 'xmlns' && '';
34462                 }
34463                 //can not set prefix,because prefix !== ''
34464                 a.localName = localName ;
34465                 //prefix == null for no ns prefix attribute 
34466                 if(nsPrefix !== false){//hack!!
34467                         if(localNSMap == null){
34468                                 localNSMap = {};
34469                                 //console.log(currentNSMap,0)
34470                                 _copy(currentNSMap,currentNSMap={});
34471                                 //console.log(currentNSMap,1)
34472                         }
34473                         currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
34474                         a.uri = 'http://www.w3.org/2000/xmlns/';
34475                         domBuilder.startPrefixMapping(nsPrefix, value); 
34476                 }
34477         }
34478         var i = el.length;
34479         while(i--){
34480                 a = el[i];
34481                 var prefix = a.prefix;
34482                 if(prefix){//no prefix attribute has no namespace
34483                         if(prefix === 'xml'){
34484                                 a.uri = 'http://www.w3.org/XML/1998/namespace';
34485                         }if(prefix !== 'xmlns'){
34486                                 a.uri = currentNSMap[prefix || ''];
34487                                 
34488                                 //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
34489                         }
34490                 }
34491         }
34492         var nsp = tagName.indexOf(':');
34493         if(nsp>0){
34494                 prefix = el.prefix = tagName.slice(0,nsp);
34495                 localName = el.localName = tagName.slice(nsp+1);
34496         }else{
34497                 prefix = null;//important!!
34498                 localName = el.localName = tagName;
34499         }
34500         //no prefix element has default namespace
34501         var ns = el.uri = currentNSMap[prefix || ''];
34502         domBuilder.startElement(ns,localName,tagName,el);
34503         //endPrefixMapping and startPrefixMapping have not any help for dom builder
34504         //localNSMap = null
34505         if(el.closed){
34506                 domBuilder.endElement(ns,localName,tagName);
34507                 if(localNSMap){
34508                         for(prefix in localNSMap){
34509                                 domBuilder.endPrefixMapping(prefix); 
34510                         }
34511                 }
34512         }else{
34513                 el.currentNSMap = currentNSMap;
34514                 el.localNSMap = localNSMap;
34515                 //parseStack.push(el);
34516                 return true;
34517         }
34518   }
34519   function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
34520         if(/^(?:script|textarea)$/i.test(tagName)){
34521                 var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
34522                 var text = source.substring(elStartEnd+1,elEndStart);
34523                 if(/[&<]/.test(text)){
34524                         if(/^script$/i.test(tagName)){
34525                                 //if(!/\]\]>/.test(text)){
34526                                         //lexHandler.startCDATA();
34527                                         domBuilder.characters(text,0,text.length);
34528                                         //lexHandler.endCDATA();
34529                                         return elEndStart;
34530                                 //}
34531                         }//}else{//text area
34532                                 text = text.replace(/&#?\w+;/g,entityReplacer);
34533                                 domBuilder.characters(text,0,text.length);
34534                                 return elEndStart;
34535                         //}
34536                         
34537                 }
34538         }
34539         return elStartEnd+1;
34540   }
34541   function fixSelfClosed(source,elStartEnd,tagName,closeMap){
34542         //if(tagName in closeMap){
34543         var pos = closeMap[tagName];
34544         if(pos == null){
34545                 //console.log(tagName)
34546                 pos =  source.lastIndexOf('</'+tagName+'>');
34547                 if(pos<elStartEnd){//忘记闭合
34548                         pos = source.lastIndexOf('</'+tagName);
34549                 }
34550                 closeMap[tagName] =pos;
34551         }
34552         return pos<elStartEnd;
34553         //} 
34554   }
34555   function _copy(source,target){
34556         for(var n in source){target[n] = source[n];}
34557   }
34558   function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
34559         var next= source.charAt(start+2);
34560         switch(next){
34561         case '-':
34562                 if(source.charAt(start + 3) === '-'){
34563                         var end = source.indexOf('-->',start+4);
34564                         //append comment source.substring(4,end)//<!--
34565                         if(end>start){
34566                                 domBuilder.comment(source,start+4,end-start-4);
34567                                 return end+3;
34568                         }else{
34569                                 errorHandler.error("Unclosed comment");
34570                                 return -1;
34571                         }
34572                 }else{
34573                         //error
34574                         return -1;
34575                 }
34576         default:
34577                 if(source.substr(start+3,6) == 'CDATA['){
34578                         var end = source.indexOf(']]>',start+9);
34579                         domBuilder.startCDATA();
34580                         domBuilder.characters(source,start+9,end-start-9);
34581                         domBuilder.endCDATA(); 
34582                         return end+3;
34583                 }
34584                 //<!DOCTYPE
34585                 //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
34586                 var matchs = split(source,start);
34587                 var len = matchs.length;
34588                 if(len>1 && /!doctype/i.test(matchs[0][0])){
34589                         var name = matchs[1][0];
34590                         var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0];
34591                         var sysid = len>4 && matchs[4][0];
34592                         var lastMatch = matchs[len-1];
34593                         domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
34594                                         sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
34595                         domBuilder.endDTD();
34596                         
34597                         return lastMatch.index+lastMatch[0].length
34598                 }
34599         }
34600         return -1;
34601   }
34602
34603
34604
34605   function parseInstruction(source,start,domBuilder){
34606         var end = source.indexOf('?>',start);
34607         if(end){
34608                 var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
34609                 if(match){
34610                         var len = match[0].length;
34611                         domBuilder.processingInstruction(match[1], match[2]) ;
34612                         return end+2;
34613                 }else{//error
34614                         return -1;
34615                 }
34616         }
34617         return -1;
34618   }
34619
34620   /**
34621    * @param source
34622    */
34623   function ElementAttributes(source){
34624         
34625   }
34626   ElementAttributes.prototype = {
34627         setTagName:function(tagName){
34628                 if(!tagNamePattern.test(tagName)){
34629                         throw new Error('invalid tagName:'+tagName)
34630                 }
34631                 this.tagName = tagName;
34632         },
34633         add:function(qName,value,offset){
34634                 if(!tagNamePattern.test(qName)){
34635                         throw new Error('invalid attribute:'+qName)
34636                 }
34637                 this[this.length++] = {qName:qName,value:value,offset:offset};
34638         },
34639         length:0,
34640         getLocalName:function(i){return this[i].localName},
34641         getLocator:function(i){return this[i].locator},
34642         getQName:function(i){return this[i].qName},
34643         getURI:function(i){return this[i].uri},
34644         getValue:function(i){return this[i].value}
34645   //    ,getIndex:function(uri, localName)){
34646   //            if(localName){
34647   //                    
34648   //            }else{
34649   //                    var qName = uri
34650   //            }
34651   //    },
34652   //    getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
34653   //    getType:function(uri,localName){}
34654   //    getType:function(i){},
34655   };
34656
34657
34658
34659
34660   function _set_proto_(thiz,parent){
34661         thiz.__proto__ = parent;
34662         return thiz;
34663   }
34664   if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
34665         _set_proto_ = function(thiz,parent){
34666                 function p(){}          p.prototype = parent;
34667                 p = new p();
34668                 for(parent in thiz){
34669                         p[parent] = thiz[parent];
34670                 }
34671                 return p;
34672         };
34673   }
34674
34675   function split(source,start){
34676         var match;
34677         var buf = [];
34678         var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
34679         reg.lastIndex = start;
34680         reg.exec(source);//skip <
34681         while(match = reg.exec(source)){
34682                 buf.push(match);
34683                 if(match[1])return buf;
34684         }
34685   }
34686
34687   var XMLReader_1 = XMLReader;
34688
34689   var sax = {
34690         XMLReader: XMLReader_1
34691   };
34692
34693   /*
34694    * DOM Level 2
34695    * Object DOMException
34696    * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
34697    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
34698    */
34699
34700   function copy$1(src,dest){
34701         for(var p in src){
34702                 dest[p] = src[p];
34703         }
34704   }
34705   /**
34706   ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
34707   ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
34708    */
34709   function _extends(Class,Super){
34710         var pt = Class.prototype;
34711         if(Object.create){
34712                 var ppt = Object.create(Super.prototype);
34713                 pt.__proto__ = ppt;
34714         }
34715         if(!(pt instanceof Super)){
34716                 function t(){}          t.prototype = Super.prototype;
34717                 t = new t();
34718                 copy$1(pt,t);
34719                 Class.prototype = pt = t;
34720         }
34721         if(pt.constructor != Class){
34722                 if(typeof Class != 'function'){
34723                         console.error("unknow Class:"+Class);
34724                 }
34725                 pt.constructor = Class;
34726         }
34727   }
34728   var htmlns = 'http://www.w3.org/1999/xhtml' ;
34729   // Node Types
34730   var NodeType = {};
34731   var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
34732   var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
34733   var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
34734   var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
34735   var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
34736   var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
34737   var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
34738   var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
34739   var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
34740   var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
34741   var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
34742   var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;
34743
34744   // ExceptionCode
34745   var ExceptionCode = {};
34746   var ExceptionMessage = {};
34747   var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
34748   var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
34749   var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
34750   var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
34751   var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
34752   var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
34753   var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
34754   var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
34755   var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
34756   var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
34757   //level2
34758   var INVALID_STATE_ERR         = ExceptionCode.INVALID_STATE_ERR               = ((ExceptionMessage[11]="Invalid state"),11);
34759   var SYNTAX_ERR                = ExceptionCode.SYNTAX_ERR                      = ((ExceptionMessage[12]="Syntax error"),12);
34760   var INVALID_MODIFICATION_ERR  = ExceptionCode.INVALID_MODIFICATION_ERR        = ((ExceptionMessage[13]="Invalid modification"),13);
34761   var NAMESPACE_ERR             = ExceptionCode.NAMESPACE_ERR                   = ((ExceptionMessage[14]="Invalid namespace"),14);
34762   var INVALID_ACCESS_ERR        = ExceptionCode.INVALID_ACCESS_ERR              = ((ExceptionMessage[15]="Invalid access"),15);
34763
34764
34765   function DOMException(code, message) {
34766         if(message instanceof Error){
34767                 var error = message;
34768         }else{
34769                 error = this;
34770                 Error.call(this, ExceptionMessage[code]);
34771                 this.message = ExceptionMessage[code];
34772                 if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
34773         }
34774         error.code = code;
34775         if(message) this.message = this.message + ": " + message;
34776         return error;
34777   }DOMException.prototype = Error.prototype;
34778   copy$1(ExceptionCode,DOMException);
34779   /**
34780    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
34781    * 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.
34782    * The items in the NodeList are accessible via an integral index, starting from 0.
34783    */
34784   function NodeList() {
34785   }NodeList.prototype = {
34786         /**
34787          * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
34788          * @standard level1
34789          */
34790         length:0, 
34791         /**
34792          * 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.
34793          * @standard level1
34794          * @param index  unsigned long 
34795          *   Index into the collection.
34796          * @return Node
34797          *      The node at the indexth position in the NodeList, or null if that is not a valid index. 
34798          */
34799         item: function(index) {
34800                 return this[index] || null;
34801         },
34802         toString:function(isHTML,nodeFilter){
34803                 for(var buf = [], i = 0;i<this.length;i++){
34804                         serializeToString(this[i],buf,isHTML,nodeFilter);
34805                 }
34806                 return buf.join('');
34807         }
34808   };
34809   function LiveNodeList(node,refresh){
34810         this._node = node;
34811         this._refresh = refresh;
34812         _updateLiveList(this);
34813   }
34814   function _updateLiveList(list){
34815         var inc = list._node._inc || list._node.ownerDocument._inc;
34816         if(list._inc != inc){
34817                 var ls = list._refresh(list._node);
34818                 //console.log(ls.length)
34819                 __set__(list,'length',ls.length);
34820                 copy$1(ls,list);
34821                 list._inc = inc;
34822         }
34823   }
34824   LiveNodeList.prototype.item = function(i){
34825         _updateLiveList(this);
34826         return this[i];
34827   };
34828
34829   _extends(LiveNodeList,NodeList);
34830   /**
34831    * 
34832    * 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.
34833    * NamedNodeMap objects in the DOM are live.
34834    * used for attributes or DocumentType entities 
34835    */
34836   function NamedNodeMap() {
34837   }
34838   function _findNodeIndex(list,node){
34839         var i = list.length;
34840         while(i--){
34841                 if(list[i] === node){return i}
34842         }
34843   }
34844
34845   function _addNamedNode(el,list,newAttr,oldAttr){
34846         if(oldAttr){
34847                 list[_findNodeIndex(list,oldAttr)] = newAttr;
34848         }else{
34849                 list[list.length++] = newAttr;
34850         }
34851         if(el){
34852                 newAttr.ownerElement = el;
34853                 var doc = el.ownerDocument;
34854                 if(doc){
34855                         oldAttr && _onRemoveAttribute(doc,el,oldAttr);
34856                         _onAddAttribute(doc,el,newAttr);
34857                 }
34858         }
34859   }
34860   function _removeNamedNode(el,list,attr){
34861         //console.log('remove attr:'+attr)
34862         var i = _findNodeIndex(list,attr);
34863         if(i>=0){
34864                 var lastIndex = list.length-1;
34865                 while(i<lastIndex){
34866                         list[i] = list[++i];
34867                 }
34868                 list.length = lastIndex;
34869                 if(el){
34870                         var doc = el.ownerDocument;
34871                         if(doc){
34872                                 _onRemoveAttribute(doc,el,attr);
34873                                 attr.ownerElement = null;
34874                         }
34875                 }
34876         }else{
34877                 throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
34878         }
34879   }
34880   NamedNodeMap.prototype = {
34881         length:0,
34882         item:NodeList.prototype.item,
34883         getNamedItem: function(key) {
34884   //            if(key.indexOf(':')>0 || key == 'xmlns'){
34885   //                    return null;
34886   //            }
34887                 //console.log()
34888                 var i = this.length;
34889                 while(i--){
34890                         var attr = this[i];
34891                         //console.log(attr.nodeName,key)
34892                         if(attr.nodeName == key){
34893                                 return attr;
34894                         }
34895                 }
34896         },
34897         setNamedItem: function(attr) {
34898                 var el = attr.ownerElement;
34899                 if(el && el!=this._ownerElement){
34900                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
34901                 }
34902                 var oldAttr = this.getNamedItem(attr.nodeName);
34903                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
34904                 return oldAttr;
34905         },
34906         /* returns Node */
34907         setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
34908                 var el = attr.ownerElement, oldAttr;
34909                 if(el && el!=this._ownerElement){
34910                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
34911                 }
34912                 oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
34913                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
34914                 return oldAttr;
34915         },
34916
34917         /* returns Node */
34918         removeNamedItem: function(key) {
34919                 var attr = this.getNamedItem(key);
34920                 _removeNamedNode(this._ownerElement,this,attr);
34921                 return attr;
34922                 
34923                 
34924         },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
34925         
34926         //for level2
34927         removeNamedItemNS:function(namespaceURI,localName){
34928                 var attr = this.getNamedItemNS(namespaceURI,localName);
34929                 _removeNamedNode(this._ownerElement,this,attr);
34930                 return attr;
34931         },
34932         getNamedItemNS: function(namespaceURI, localName) {
34933                 var i = this.length;
34934                 while(i--){
34935                         var node = this[i];
34936                         if(node.localName == localName && node.namespaceURI == namespaceURI){
34937                                 return node;
34938                         }
34939                 }
34940                 return null;
34941         }
34942   };
34943   /**
34944    * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
34945    */
34946   function DOMImplementation(/* Object */ features) {
34947         this._features = {};
34948         if (features) {
34949                 for (var feature in features) {
34950                          this._features = features[feature];
34951                 }
34952         }
34953   }
34954   DOMImplementation.prototype = {
34955         hasFeature: function(/* string */ feature, /* string */ version) {
34956                 var versions = this._features[feature.toLowerCase()];
34957                 if (versions && (!version || version in versions)) {
34958                         return true;
34959                 } else {
34960                         return false;
34961                 }
34962         },
34963         // Introduced in DOM Level 2:
34964         createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
34965                 var doc = new Document();
34966                 doc.implementation = this;
34967                 doc.childNodes = new NodeList();
34968                 doc.doctype = doctype;
34969                 if(doctype){
34970                         doc.appendChild(doctype);
34971                 }
34972                 if(qualifiedName){
34973                         var root = doc.createElementNS(namespaceURI,qualifiedName);
34974                         doc.appendChild(root);
34975                 }
34976                 return doc;
34977         },
34978         // Introduced in DOM Level 2:
34979         createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
34980                 var node = new DocumentType();
34981                 node.name = qualifiedName;
34982                 node.nodeName = qualifiedName;
34983                 node.publicId = publicId;
34984                 node.systemId = systemId;
34985                 // Introduced in DOM Level 2:
34986                 //readonly attribute DOMString        internalSubset;
34987                 
34988                 //TODO:..
34989                 //  readonly attribute NamedNodeMap     entities;
34990                 //  readonly attribute NamedNodeMap     notations;
34991                 return node;
34992         }
34993   };
34994
34995
34996   /**
34997    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
34998    */
34999
35000   function Node$2() {
35001   }
35002   Node$2.prototype = {
35003         firstChild : null,
35004         lastChild : null,
35005         previousSibling : null,
35006         nextSibling : null,
35007         attributes : null,
35008         parentNode : null,
35009         childNodes : null,
35010         ownerDocument : null,
35011         nodeValue : null,
35012         namespaceURI : null,
35013         prefix : null,
35014         localName : null,
35015         // Modified in DOM Level 2:
35016         insertBefore:function(newChild, refChild){//raises 
35017                 return _insertBefore(this,newChild,refChild);
35018         },
35019         replaceChild:function(newChild, oldChild){//raises 
35020                 this.insertBefore(newChild,oldChild);
35021                 if(oldChild){
35022                         this.removeChild(oldChild);
35023                 }
35024         },
35025         removeChild:function(oldChild){
35026                 return _removeChild(this,oldChild);
35027         },
35028         appendChild:function(newChild){
35029                 return this.insertBefore(newChild,null);
35030         },
35031         hasChildNodes:function(){
35032                 return this.firstChild != null;
35033         },
35034         cloneNode:function(deep){
35035                 return cloneNode(this.ownerDocument||this,this,deep);
35036         },
35037         // Modified in DOM Level 2:
35038         normalize:function(){
35039                 var child = this.firstChild;
35040                 while(child){
35041                         var next = child.nextSibling;
35042                         if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
35043                                 this.removeChild(next);
35044                                 child.appendData(next.data);
35045                         }else{
35046                                 child.normalize();
35047                                 child = next;
35048                         }
35049                 }
35050         },
35051         // Introduced in DOM Level 2:
35052         isSupported:function(feature, version){
35053                 return this.ownerDocument.implementation.hasFeature(feature,version);
35054         },
35055       // Introduced in DOM Level 2:
35056       hasAttributes:function(){
35057         return this.attributes.length>0;
35058       },
35059       lookupPrefix:function(namespaceURI){
35060         var el = this;
35061         while(el){
35062                 var map = el._nsMap;
35063                 //console.dir(map)
35064                 if(map){
35065                         for(var n in map){
35066                                 if(map[n] == namespaceURI){
35067                                         return n;
35068                                 }
35069                         }
35070                 }
35071                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
35072         }
35073         return null;
35074       },
35075       // Introduced in DOM Level 3:
35076       lookupNamespaceURI:function(prefix){
35077         var el = this;
35078         while(el){
35079                 var map = el._nsMap;
35080                 //console.dir(map)
35081                 if(map){
35082                         if(prefix in map){
35083                                 return map[prefix] ;
35084                         }
35085                 }
35086                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
35087         }
35088         return null;
35089       },
35090       // Introduced in DOM Level 3:
35091       isDefaultNamespace:function(namespaceURI){
35092         var prefix = this.lookupPrefix(namespaceURI);
35093         return prefix == null;
35094       }
35095   };
35096
35097
35098   function _xmlEncoder(c){
35099         return c == '<' && '&lt;' ||
35100            c == '>' && '&gt;' ||
35101            c == '&' && '&amp;' ||
35102            c == '"' && '&quot;' ||
35103            '&#'+c.charCodeAt()+';'
35104   }
35105
35106
35107   copy$1(NodeType,Node$2);
35108   copy$1(NodeType,Node$2.prototype);
35109
35110   /**
35111    * @param callback return true for continue,false for break
35112    * @return boolean true: break visit;
35113    */
35114   function _visitNode(node,callback){
35115         if(callback(node)){
35116                 return true;
35117         }
35118         if(node = node.firstChild){
35119                 do{
35120                         if(_visitNode(node,callback)){return true}
35121           }while(node=node.nextSibling)
35122       }
35123   }
35124
35125
35126
35127   function Document(){
35128   }
35129   function _onAddAttribute(doc,el,newAttr){
35130         doc && doc._inc++;
35131         var ns = newAttr.namespaceURI ;
35132         if(ns == 'http://www.w3.org/2000/xmlns/'){
35133                 //update namespace
35134                 el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
35135         }
35136   }
35137   function _onRemoveAttribute(doc,el,newAttr,remove){
35138         doc && doc._inc++;
35139         var ns = newAttr.namespaceURI ;
35140         if(ns == 'http://www.w3.org/2000/xmlns/'){
35141                 //update namespace
35142                 delete el._nsMap[newAttr.prefix?newAttr.localName:''];
35143         }
35144   }
35145   function _onUpdateChild(doc,el,newChild){
35146         if(doc && doc._inc){
35147                 doc._inc++;
35148                 //update childNodes
35149                 var cs = el.childNodes;
35150                 if(newChild){
35151                         cs[cs.length++] = newChild;
35152                 }else{
35153                         //console.log(1)
35154                         var child = el.firstChild;
35155                         var i = 0;
35156                         while(child){
35157                                 cs[i++] = child;
35158                                 child =child.nextSibling;
35159                         }
35160                         cs.length = i;
35161                 }
35162         }
35163   }
35164
35165   /**
35166    * attributes;
35167    * children;
35168    * 
35169    * writeable properties:
35170    * nodeValue,Attr:value,CharacterData:data
35171    * prefix
35172    */
35173   function _removeChild(parentNode,child){
35174         var previous = child.previousSibling;
35175         var next = child.nextSibling;
35176         if(previous){
35177                 previous.nextSibling = next;
35178         }else{
35179                 parentNode.firstChild = next;
35180         }
35181         if(next){
35182                 next.previousSibling = previous;
35183         }else{
35184                 parentNode.lastChild = previous;
35185         }
35186         _onUpdateChild(parentNode.ownerDocument,parentNode);
35187         return child;
35188   }
35189   /**
35190    * preformance key(refChild == null)
35191    */
35192   function _insertBefore(parentNode,newChild,nextChild){
35193         var cp = newChild.parentNode;
35194         if(cp){
35195                 cp.removeChild(newChild);//remove and update
35196         }
35197         if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
35198                 var newFirst = newChild.firstChild;
35199                 if (newFirst == null) {
35200                         return newChild;
35201                 }
35202                 var newLast = newChild.lastChild;
35203         }else{
35204                 newFirst = newLast = newChild;
35205         }
35206         var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
35207
35208         newFirst.previousSibling = pre;
35209         newLast.nextSibling = nextChild;
35210         
35211         
35212         if(pre){
35213                 pre.nextSibling = newFirst;
35214         }else{
35215                 parentNode.firstChild = newFirst;
35216         }
35217         if(nextChild == null){
35218                 parentNode.lastChild = newLast;
35219         }else{
35220                 nextChild.previousSibling = newLast;
35221         }
35222         do{
35223                 newFirst.parentNode = parentNode;
35224         }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
35225         _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
35226         //console.log(parentNode.lastChild.nextSibling == null)
35227         if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
35228                 newChild.firstChild = newChild.lastChild = null;
35229         }
35230         return newChild;
35231   }
35232   function _appendSingleChild(parentNode,newChild){
35233         var cp = newChild.parentNode;
35234         if(cp){
35235                 var pre = parentNode.lastChild;
35236                 cp.removeChild(newChild);//remove and update
35237                 var pre = parentNode.lastChild;
35238         }
35239         var pre = parentNode.lastChild;
35240         newChild.parentNode = parentNode;
35241         newChild.previousSibling = pre;
35242         newChild.nextSibling = null;
35243         if(pre){
35244                 pre.nextSibling = newChild;
35245         }else{
35246                 parentNode.firstChild = newChild;
35247         }
35248         parentNode.lastChild = newChild;
35249         _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
35250         return newChild;
35251         //console.log("__aa",parentNode.lastChild.nextSibling == null)
35252   }
35253   Document.prototype = {
35254         //implementation : null,
35255         nodeName :  '#document',
35256         nodeType :  DOCUMENT_NODE,
35257         doctype :  null,
35258         documentElement :  null,
35259         _inc : 1,
35260         
35261         insertBefore :  function(newChild, refChild){//raises 
35262                 if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
35263                         var child = newChild.firstChild;
35264                         while(child){
35265                                 var next = child.nextSibling;
35266                                 this.insertBefore(child,refChild);
35267                                 child = next;
35268                         }
35269                         return newChild;
35270                 }
35271                 if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
35272                         this.documentElement = newChild;
35273                 }
35274                 
35275                 return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
35276         },
35277         removeChild :  function(oldChild){
35278                 if(this.documentElement == oldChild){
35279                         this.documentElement = null;
35280                 }
35281                 return _removeChild(this,oldChild);
35282         },
35283         // Introduced in DOM Level 2:
35284         importNode : function(importedNode,deep){
35285                 return importNode(this,importedNode,deep);
35286         },
35287         // Introduced in DOM Level 2:
35288         getElementById :        function(id){
35289                 var rtv = null;
35290                 _visitNode(this.documentElement,function(node){
35291                         if(node.nodeType == ELEMENT_NODE){
35292                                 if(node.getAttribute('id') == id){
35293                                         rtv = node;
35294                                         return true;
35295                                 }
35296                         }
35297                 });
35298                 return rtv;
35299         },
35300         
35301         //document factory method:
35302         createElement : function(tagName){
35303                 var node = new Element();
35304                 node.ownerDocument = this;
35305                 node.nodeName = tagName;
35306                 node.tagName = tagName;
35307                 node.childNodes = new NodeList();
35308                 var attrs       = node.attributes = new NamedNodeMap();
35309                 attrs._ownerElement = node;
35310                 return node;
35311         },
35312         createDocumentFragment :        function(){
35313                 var node = new DocumentFragment();
35314                 node.ownerDocument = this;
35315                 node.childNodes = new NodeList();
35316                 return node;
35317         },
35318         createTextNode :        function(data){
35319                 var node = new Text();
35320                 node.ownerDocument = this;
35321                 node.appendData(data);
35322                 return node;
35323         },
35324         createComment : function(data){
35325                 var node = new Comment();
35326                 node.ownerDocument = this;
35327                 node.appendData(data);
35328                 return node;
35329         },
35330         createCDATASection :    function(data){
35331                 var node = new CDATASection();
35332                 node.ownerDocument = this;
35333                 node.appendData(data);
35334                 return node;
35335         },
35336         createProcessingInstruction :   function(target,data){
35337                 var node = new ProcessingInstruction();
35338                 node.ownerDocument = this;
35339                 node.tagName = node.target = target;
35340                 node.nodeValue= node.data = data;
35341                 return node;
35342         },
35343         createAttribute :       function(name){
35344                 var node = new Attr();
35345                 node.ownerDocument      = this;
35346                 node.name = name;
35347                 node.nodeName   = name;
35348                 node.localName = name;
35349                 node.specified = true;
35350                 return node;
35351         },
35352         createEntityReference : function(name){
35353                 var node = new EntityReference();
35354                 node.ownerDocument      = this;
35355                 node.nodeName   = name;
35356                 return node;
35357         },
35358         // Introduced in DOM Level 2:
35359         createElementNS :       function(namespaceURI,qualifiedName){
35360                 var node = new Element();
35361                 var pl = qualifiedName.split(':');
35362                 var attrs       = node.attributes = new NamedNodeMap();
35363                 node.childNodes = new NodeList();
35364                 node.ownerDocument = this;
35365                 node.nodeName = qualifiedName;
35366                 node.tagName = qualifiedName;
35367                 node.namespaceURI = namespaceURI;
35368                 if(pl.length == 2){
35369                         node.prefix = pl[0];
35370                         node.localName = pl[1];
35371                 }else{
35372                         //el.prefix = null;
35373                         node.localName = qualifiedName;
35374                 }
35375                 attrs._ownerElement = node;
35376                 return node;
35377         },
35378         // Introduced in DOM Level 2:
35379         createAttributeNS :     function(namespaceURI,qualifiedName){
35380                 var node = new Attr();
35381                 var pl = qualifiedName.split(':');
35382                 node.ownerDocument = this;
35383                 node.nodeName = qualifiedName;
35384                 node.name = qualifiedName;
35385                 node.namespaceURI = namespaceURI;
35386                 node.specified = true;
35387                 if(pl.length == 2){
35388                         node.prefix = pl[0];
35389                         node.localName = pl[1];
35390                 }else{
35391                         //el.prefix = null;
35392                         node.localName = qualifiedName;
35393                 }
35394                 return node;
35395         }
35396   };
35397   _extends(Document,Node$2);
35398
35399
35400   function Element() {
35401         this._nsMap = {};
35402   }Element.prototype = {
35403         nodeType : ELEMENT_NODE,
35404         hasAttribute : function(name){
35405                 return this.getAttributeNode(name)!=null;
35406         },
35407         getAttribute : function(name){
35408                 var attr = this.getAttributeNode(name);
35409                 return attr && attr.value || '';
35410         },
35411         getAttributeNode : function(name){
35412                 return this.attributes.getNamedItem(name);
35413         },
35414         setAttribute : function(name, value){
35415                 var attr = this.ownerDocument.createAttribute(name);
35416                 attr.value = attr.nodeValue = "" + value;
35417                 this.setAttributeNode(attr);
35418         },
35419         removeAttribute : function(name){
35420                 var attr = this.getAttributeNode(name);
35421                 attr && this.removeAttributeNode(attr);
35422         },
35423         
35424         //four real opeartion method
35425         appendChild:function(newChild){
35426                 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
35427                         return this.insertBefore(newChild,null);
35428                 }else{
35429                         return _appendSingleChild(this,newChild);
35430                 }
35431         },
35432         setAttributeNode : function(newAttr){
35433                 return this.attributes.setNamedItem(newAttr);
35434         },
35435         setAttributeNodeNS : function(newAttr){
35436                 return this.attributes.setNamedItemNS(newAttr);
35437         },
35438         removeAttributeNode : function(oldAttr){
35439                 //console.log(this == oldAttr.ownerElement)
35440                 return this.attributes.removeNamedItem(oldAttr.nodeName);
35441         },
35442         //get real attribute name,and remove it by removeAttributeNode
35443         removeAttributeNS : function(namespaceURI, localName){
35444                 var old = this.getAttributeNodeNS(namespaceURI, localName);
35445                 old && this.removeAttributeNode(old);
35446         },
35447         
35448         hasAttributeNS : function(namespaceURI, localName){
35449                 return this.getAttributeNodeNS(namespaceURI, localName)!=null;
35450         },
35451         getAttributeNS : function(namespaceURI, localName){
35452                 var attr = this.getAttributeNodeNS(namespaceURI, localName);
35453                 return attr && attr.value || '';
35454         },
35455         setAttributeNS : function(namespaceURI, qualifiedName, value){
35456                 var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
35457                 attr.value = attr.nodeValue = "" + value;
35458                 this.setAttributeNode(attr);
35459         },
35460         getAttributeNodeNS : function(namespaceURI, localName){
35461                 return this.attributes.getNamedItemNS(namespaceURI, localName);
35462         },
35463         
35464         getElementsByTagName : function(tagName){
35465                 return new LiveNodeList(this,function(base){
35466                         var ls = [];
35467                         _visitNode(base,function(node){
35468                                 if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
35469                                         ls.push(node);
35470                                 }
35471                         });
35472                         return ls;
35473                 });
35474         },
35475         getElementsByTagNameNS : function(namespaceURI, localName){
35476                 return new LiveNodeList(this,function(base){
35477                         var ls = [];
35478                         _visitNode(base,function(node){
35479                                 if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
35480                                         ls.push(node);
35481                                 }
35482                         });
35483                         return ls;
35484                         
35485                 });
35486         }
35487   };
35488   Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
35489   Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
35490
35491
35492   _extends(Element,Node$2);
35493   function Attr() {
35494   }Attr.prototype.nodeType = ATTRIBUTE_NODE;
35495   _extends(Attr,Node$2);
35496
35497
35498   function CharacterData() {
35499   }CharacterData.prototype = {
35500         data : '',
35501         substringData : function(offset, count) {
35502                 return this.data.substring(offset, offset+count);
35503         },
35504         appendData: function(text) {
35505                 text = this.data+text;
35506                 this.nodeValue = this.data = text;
35507                 this.length = text.length;
35508         },
35509         insertData: function(offset,text) {
35510                 this.replaceData(offset,0,text);
35511         
35512         },
35513         appendChild:function(newChild){
35514                 throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
35515         },
35516         deleteData: function(offset, count) {
35517                 this.replaceData(offset,count,"");
35518         },
35519         replaceData: function(offset, count, text) {
35520                 var start = this.data.substring(0,offset);
35521                 var end = this.data.substring(offset+count);
35522                 text = start + text + end;
35523                 this.nodeValue = this.data = text;
35524                 this.length = text.length;
35525         }
35526   };
35527   _extends(CharacterData,Node$2);
35528   function Text() {
35529   }Text.prototype = {
35530         nodeName : "#text",
35531         nodeType : TEXT_NODE,
35532         splitText : function(offset) {
35533                 var text = this.data;
35534                 var newText = text.substring(offset);
35535                 text = text.substring(0, offset);
35536                 this.data = this.nodeValue = text;
35537                 this.length = text.length;
35538                 var newNode = this.ownerDocument.createTextNode(newText);
35539                 if(this.parentNode){
35540                         this.parentNode.insertBefore(newNode, this.nextSibling);
35541                 }
35542                 return newNode;
35543         }
35544   };
35545   _extends(Text,CharacterData);
35546   function Comment() {
35547   }Comment.prototype = {
35548         nodeName : "#comment",
35549         nodeType : COMMENT_NODE
35550   };
35551   _extends(Comment,CharacterData);
35552
35553   function CDATASection() {
35554   }CDATASection.prototype = {
35555         nodeName : "#cdata-section",
35556         nodeType : CDATA_SECTION_NODE
35557   };
35558   _extends(CDATASection,CharacterData);
35559
35560
35561   function DocumentType() {
35562   }DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
35563   _extends(DocumentType,Node$2);
35564
35565   function Notation() {
35566   }Notation.prototype.nodeType = NOTATION_NODE;
35567   _extends(Notation,Node$2);
35568
35569   function Entity() {
35570   }Entity.prototype.nodeType = ENTITY_NODE;
35571   _extends(Entity,Node$2);
35572
35573   function EntityReference() {
35574   }EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
35575   _extends(EntityReference,Node$2);
35576
35577   function DocumentFragment() {
35578   }DocumentFragment.prototype.nodeName =        "#document-fragment";
35579   DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE;
35580   _extends(DocumentFragment,Node$2);
35581
35582
35583   function ProcessingInstruction() {
35584   }
35585   ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
35586   _extends(ProcessingInstruction,Node$2);
35587   function XMLSerializer$1(){}
35588   XMLSerializer$1.prototype.serializeToString = function(node,isHtml,nodeFilter){
35589         return nodeSerializeToString.call(node,isHtml,nodeFilter);
35590   };
35591   Node$2.prototype.toString = nodeSerializeToString;
35592   function nodeSerializeToString(isHtml,nodeFilter){
35593         var buf = [];
35594         var refNode = this.nodeType == 9?this.documentElement:this;
35595         var prefix = refNode.prefix;
35596         var uri = refNode.namespaceURI;
35597         
35598         if(uri && prefix == null){
35599                 //console.log(prefix)
35600                 var prefix = refNode.lookupPrefix(uri);
35601                 if(prefix == null){
35602                         //isHTML = true;
35603                         var visibleNamespaces=[
35604                         {namespace:uri,prefix:null}
35605                         //{namespace:uri,prefix:''}
35606                         ];
35607                 }
35608         }
35609         serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
35610         //console.log('###',this.nodeType,uri,prefix,buf.join(''))
35611         return buf.join('');
35612   }
35613   function needNamespaceDefine(node,isHTML, visibleNamespaces) {
35614         var prefix = node.prefix||'';
35615         var uri = node.namespaceURI;
35616         if (!prefix && !uri){
35617                 return false;
35618         }
35619         if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
35620                 || uri == 'http://www.w3.org/2000/xmlns/'){
35621                 return false;
35622         }
35623         
35624         var i = visibleNamespaces.length; 
35625         //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
35626         while (i--) {
35627                 var ns = visibleNamespaces[i];
35628                 // get namespace prefix
35629                 //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
35630                 if (ns.prefix == prefix){
35631                         return ns.namespace != uri;
35632                 }
35633         }
35634         //console.log(isHTML,uri,prefix=='')
35635         //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
35636         //      return false;
35637         //}
35638         //node.flag = '11111'
35639         //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
35640         return true;
35641   }
35642   function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
35643         if(nodeFilter){
35644                 node = nodeFilter(node);
35645                 if(node){
35646                         if(typeof node == 'string'){
35647                                 buf.push(node);
35648                                 return;
35649                         }
35650                 }else{
35651                         return;
35652                 }
35653                 //buf.sort.apply(attrs, attributeSorter);
35654         }
35655         switch(node.nodeType){
35656         case ELEMENT_NODE:
35657                 if (!visibleNamespaces) visibleNamespaces = [];
35658                 var startVisibleNamespaces = visibleNamespaces.length;
35659                 var attrs = node.attributes;
35660                 var len = attrs.length;
35661                 var child = node.firstChild;
35662                 var nodeName = node.tagName;
35663                 
35664                 isHTML =  (htmlns === node.namespaceURI) ||isHTML; 
35665                 buf.push('<',nodeName);
35666                 
35667                 
35668                 
35669                 for(var i=0;i<len;i++){
35670                         // add namespaces for attributes
35671                         var attr = attrs.item(i);
35672                         if (attr.prefix == 'xmlns') {
35673                                 visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
35674                         }else if(attr.nodeName == 'xmlns'){
35675                                 visibleNamespaces.push({ prefix: '', namespace: attr.value });
35676                         }
35677                 }
35678                 for(var i=0;i<len;i++){
35679                         var attr = attrs.item(i);
35680                         if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
35681                                 var prefix = attr.prefix||'';
35682                                 var uri = attr.namespaceURI;
35683                                 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
35684                                 buf.push(ns, '="' , uri , '"');
35685                                 visibleNamespaces.push({ prefix: prefix, namespace:uri });
35686                         }
35687                         serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
35688                 }
35689                 // add namespace for current node               
35690                 if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
35691                         var prefix = node.prefix||'';
35692                         var uri = node.namespaceURI;
35693                         var ns = prefix ? ' xmlns:' + prefix : " xmlns";
35694                         buf.push(ns, '="' , uri , '"');
35695                         visibleNamespaces.push({ prefix: prefix, namespace:uri });
35696                 }
35697                 
35698                 if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
35699                         buf.push('>');
35700                         //if is cdata child node
35701                         if(isHTML && /^script$/i.test(nodeName)){
35702                                 while(child){
35703                                         if(child.data){
35704                                                 buf.push(child.data);
35705                                         }else{
35706                                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
35707                                         }
35708                                         child = child.nextSibling;
35709                                 }
35710                         }else
35711                         {
35712                                 while(child){
35713                                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
35714                                         child = child.nextSibling;
35715                                 }
35716                         }
35717                         buf.push('</',nodeName,'>');
35718                 }else{
35719                         buf.push('/>');
35720                 }
35721                 // remove added visible namespaces
35722                 //visibleNamespaces.length = startVisibleNamespaces;
35723                 return;
35724         case DOCUMENT_NODE:
35725         case DOCUMENT_FRAGMENT_NODE:
35726                 var child = node.firstChild;
35727                 while(child){
35728                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
35729                         child = child.nextSibling;
35730                 }
35731                 return;
35732         case ATTRIBUTE_NODE:
35733                 return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
35734         case TEXT_NODE:
35735                 return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
35736         case CDATA_SECTION_NODE:
35737                 return buf.push( '<![CDATA[',node.data,']]>');
35738         case COMMENT_NODE:
35739                 return buf.push( "<!--",node.data,"-->");
35740         case DOCUMENT_TYPE_NODE:
35741                 var pubid = node.publicId;
35742                 var sysid = node.systemId;
35743                 buf.push('<!DOCTYPE ',node.name);
35744                 if(pubid){
35745                         buf.push(' PUBLIC "',pubid);
35746                         if (sysid && sysid!='.') {
35747                                 buf.push( '" "',sysid);
35748                         }
35749                         buf.push('">');
35750                 }else if(sysid && sysid!='.'){
35751                         buf.push(' SYSTEM "',sysid,'">');
35752                 }else{
35753                         var sub = node.internalSubset;
35754                         if(sub){
35755                                 buf.push(" [",sub,"]");
35756                         }
35757                         buf.push(">");
35758                 }
35759                 return;
35760         case PROCESSING_INSTRUCTION_NODE:
35761                 return buf.push( "<?",node.target," ",node.data,"?>");
35762         case ENTITY_REFERENCE_NODE:
35763                 return buf.push( '&',node.nodeName,';');
35764         //case ENTITY_NODE:
35765         //case NOTATION_NODE:
35766         default:
35767                 buf.push('??',node.nodeName);
35768         }
35769   }
35770   function importNode(doc,node,deep){
35771         var node2;
35772         switch (node.nodeType) {
35773         case ELEMENT_NODE:
35774                 node2 = node.cloneNode(false);
35775                 node2.ownerDocument = doc;
35776                 //var attrs = node2.attributes;
35777                 //var len = attrs.length;
35778                 //for(var i=0;i<len;i++){
35779                         //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
35780                 //}
35781         case DOCUMENT_FRAGMENT_NODE:
35782                 break;
35783         case ATTRIBUTE_NODE:
35784                 deep = true;
35785                 break;
35786         //case ENTITY_REFERENCE_NODE:
35787         //case PROCESSING_INSTRUCTION_NODE:
35788         ////case TEXT_NODE:
35789         //case CDATA_SECTION_NODE:
35790         //case COMMENT_NODE:
35791         //      deep = false;
35792         //      break;
35793         //case DOCUMENT_NODE:
35794         //case DOCUMENT_TYPE_NODE:
35795         //cannot be imported.
35796         //case ENTITY_NODE:
35797         //case NOTATION_NODE:
35798         //can not hit in level3
35799         //default:throw e;
35800         }
35801         if(!node2){
35802                 node2 = node.cloneNode(false);//false
35803         }
35804         node2.ownerDocument = doc;
35805         node2.parentNode = null;
35806         if(deep){
35807                 var child = node.firstChild;
35808                 while(child){
35809                         node2.appendChild(importNode(doc,child,deep));
35810                         child = child.nextSibling;
35811                 }
35812         }
35813         return node2;
35814   }
35815   //
35816   //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
35817   //                                    attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
35818   function cloneNode(doc,node,deep){
35819         var node2 = new node.constructor();
35820         for(var n in node){
35821                 var v = node[n];
35822                 if(typeof v != 'object' ){
35823                         if(v != node2[n]){
35824                                 node2[n] = v;
35825                         }
35826                 }
35827         }
35828         if(node.childNodes){
35829                 node2.childNodes = new NodeList();
35830         }
35831         node2.ownerDocument = doc;
35832         switch (node2.nodeType) {
35833         case ELEMENT_NODE:
35834                 var attrs       = node.attributes;
35835                 var attrs2      = node2.attributes = new NamedNodeMap();
35836                 var len = attrs.length;
35837                 attrs2._ownerElement = node2;
35838                 for(var i=0;i<len;i++){
35839                         node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
35840                 }
35841                 break;
35842         case ATTRIBUTE_NODE:
35843                 deep = true;
35844         }
35845         if(deep){
35846                 var child = node.firstChild;
35847                 while(child){
35848                         node2.appendChild(cloneNode(doc,child,deep));
35849                         child = child.nextSibling;
35850                 }
35851         }
35852         return node2;
35853   }
35854
35855   function __set__(object,key,value){
35856         object[key] = value;
35857   }
35858   //do dynamic
35859   try{
35860         if(Object.defineProperty){
35861                 Object.defineProperty(LiveNodeList.prototype,'length',{
35862                         get:function(){
35863                                 _updateLiveList(this);
35864                                 return this.$$length;
35865                         }
35866                 });
35867                 Object.defineProperty(Node$2.prototype,'textContent',{
35868                         get:function(){
35869                                 return getTextContent(this);
35870                         },
35871                         set:function(data){
35872                                 switch(this.nodeType){
35873                                 case ELEMENT_NODE:
35874                                 case DOCUMENT_FRAGMENT_NODE:
35875                                         while(this.firstChild){
35876                                                 this.removeChild(this.firstChild);
35877                                         }
35878                                         if(data || String(data)){
35879                                                 this.appendChild(this.ownerDocument.createTextNode(data));
35880                                         }
35881                                         break;
35882                                 default:
35883                                         //TODO:
35884                                         this.data = data;
35885                                         this.value = data;
35886                                         this.nodeValue = data;
35887                                 }
35888                         }
35889                 });
35890                 
35891                 function getTextContent(node){
35892                         switch(node.nodeType){
35893                         case ELEMENT_NODE:
35894                         case DOCUMENT_FRAGMENT_NODE:
35895                                 var buf = [];
35896                                 node = node.firstChild;
35897                                 while(node){
35898                                         if(node.nodeType!==7 && node.nodeType !==8){
35899                                                 buf.push(getTextContent(node));
35900                                         }
35901                                         node = node.nextSibling;
35902                                 }
35903                                 return buf.join('');
35904                         default:
35905                                 return node.nodeValue;
35906                         }
35907                 }
35908                 __set__ = function(object,key,value){
35909                         //console.log(value)
35910                         object['$$'+key] = value;
35911                 };
35912         }
35913   }catch(e){//ie8
35914   }
35915
35916   //if(typeof require == 'function'){
35917         var DOMImplementation_1 = DOMImplementation;
35918         var XMLSerializer_1 = XMLSerializer$1;
35919   //}
35920
35921   var dom = {
35922         DOMImplementation: DOMImplementation_1,
35923         XMLSerializer: XMLSerializer_1
35924   };
35925
35926   var domParser = createCommonjsModule(function (module, exports) {
35927   function DOMParser(options){
35928         this.options = options ||{locator:{}};
35929         
35930   }
35931   DOMParser.prototype.parseFromString = function(source,mimeType){
35932         var options = this.options;
35933         var sax =  new XMLReader();
35934         var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
35935         var errorHandler = options.errorHandler;
35936         var locator = options.locator;
35937         var defaultNSMap = options.xmlns||{};
35938         var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"};
35939         if(locator){
35940                 domBuilder.setDocumentLocator(locator);
35941         }
35942         
35943         sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
35944         sax.domBuilder = options.domBuilder || domBuilder;
35945         if(/\/x?html?$/.test(mimeType)){
35946                 entityMap.nbsp = '\xa0';
35947                 entityMap.copy = '\xa9';
35948                 defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
35949         }
35950         defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
35951         if(source){
35952                 sax.parse(source,defaultNSMap,entityMap);
35953         }else{
35954                 sax.errorHandler.error("invalid doc source");
35955         }
35956         return domBuilder.doc;
35957   };
35958   function buildErrorHandler(errorImpl,domBuilder,locator){
35959         if(!errorImpl){
35960                 if(domBuilder instanceof DOMHandler){
35961                         return domBuilder;
35962                 }
35963                 errorImpl = domBuilder ;
35964         }
35965         var errorHandler = {};
35966         var isCallback = errorImpl instanceof Function;
35967         locator = locator||{};
35968         function build(key){
35969                 var fn = errorImpl[key];
35970                 if(!fn && isCallback){
35971                         fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl;
35972                 }
35973                 errorHandler[key] = fn && function(msg){
35974                         fn('[xmldom '+key+']\t'+msg+_locator(locator));
35975                 }||function(){};
35976         }
35977         build('warning');
35978         build('error');
35979         build('fatalError');
35980         return errorHandler;
35981   }
35982
35983   //console.log('#\n\n\n\n\n\n\n####')
35984   /**
35985    * +ContentHandler+ErrorHandler
35986    * +LexicalHandler+EntityResolver2
35987    * -DeclHandler-DTDHandler 
35988    * 
35989    * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
35990    * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
35991    * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
35992    */
35993   function DOMHandler() {
35994       this.cdata = false;
35995   }
35996   function position(locator,node){
35997         node.lineNumber = locator.lineNumber;
35998         node.columnNumber = locator.columnNumber;
35999   }
36000   /**
36001    * @see org.xml.sax.ContentHandler#startDocument
36002    * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
36003    */ 
36004   DOMHandler.prototype = {
36005         startDocument : function() {
36006         this.doc = new DOMImplementation().createDocument(null, null, null);
36007         if (this.locator) {
36008                 this.doc.documentURI = this.locator.systemId;
36009         }
36010         },
36011         startElement:function(namespaceURI, localName, qName, attrs) {
36012                 var doc = this.doc;
36013             var el = doc.createElementNS(namespaceURI, qName||localName);
36014             var len = attrs.length;
36015             appendElement(this, el);
36016             this.currentElement = el;
36017             
36018                 this.locator && position(this.locator,el);
36019             for (var i = 0 ; i < len; i++) {
36020                 var namespaceURI = attrs.getURI(i);
36021                 var value = attrs.getValue(i);
36022                 var qName = attrs.getQName(i);
36023                         var attr = doc.createAttributeNS(namespaceURI, qName);
36024                         this.locator &&position(attrs.getLocator(i),attr);
36025                         attr.value = attr.nodeValue = value;
36026                         el.setAttributeNode(attr);
36027             }
36028         },
36029         endElement:function(namespaceURI, localName, qName) {
36030                 var current = this.currentElement;
36031                 var tagName = current.tagName;
36032                 this.currentElement = current.parentNode;
36033         },
36034         startPrefixMapping:function(prefix, uri) {
36035         },
36036         endPrefixMapping:function(prefix) {
36037         },
36038         processingInstruction:function(target, data) {
36039             var ins = this.doc.createProcessingInstruction(target, data);
36040             this.locator && position(this.locator,ins);
36041             appendElement(this, ins);
36042         },
36043         ignorableWhitespace:function(ch, start, length) {
36044         },
36045         characters:function(chars, start, length) {
36046                 chars = _toString.apply(this,arguments);
36047                 //console.log(chars)
36048                 if(chars){
36049                         if (this.cdata) {
36050                                 var charNode = this.doc.createCDATASection(chars);
36051                         } else {
36052                                 var charNode = this.doc.createTextNode(chars);
36053                         }
36054                         if(this.currentElement){
36055                                 this.currentElement.appendChild(charNode);
36056                         }else if(/^\s*$/.test(chars)){
36057                                 this.doc.appendChild(charNode);
36058                                 //process xml
36059                         }
36060                         this.locator && position(this.locator,charNode);
36061                 }
36062         },
36063         skippedEntity:function(name) {
36064         },
36065         endDocument:function() {
36066                 this.doc.normalize();
36067         },
36068         setDocumentLocator:function (locator) {
36069             if(this.locator = locator){// && !('lineNumber' in locator)){
36070                 locator.lineNumber = 0;
36071             }
36072         },
36073         //LexicalHandler
36074         comment:function(chars, start, length) {
36075                 chars = _toString.apply(this,arguments);
36076             var comm = this.doc.createComment(chars);
36077             this.locator && position(this.locator,comm);
36078             appendElement(this, comm);
36079         },
36080         
36081         startCDATA:function() {
36082             //used in characters() methods
36083             this.cdata = true;
36084         },
36085         endCDATA:function() {
36086             this.cdata = false;
36087         },
36088         
36089         startDTD:function(name, publicId, systemId) {
36090                 var impl = this.doc.implementation;
36091             if (impl && impl.createDocumentType) {
36092                 var dt = impl.createDocumentType(name, publicId, systemId);
36093                 this.locator && position(this.locator,dt);
36094                 appendElement(this, dt);
36095             }
36096         },
36097         /**
36098          * @see org.xml.sax.ErrorHandler
36099          * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
36100          */
36101         warning:function(error) {
36102                 console.warn('[xmldom warning]\t'+error,_locator(this.locator));
36103         },
36104         error:function(error) {
36105                 console.error('[xmldom error]\t'+error,_locator(this.locator));
36106         },
36107         fatalError:function(error) {
36108                 console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
36109             throw error;
36110         }
36111   };
36112   function _locator(l){
36113         if(l){
36114                 return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
36115         }
36116   }
36117   function _toString(chars,start,length){
36118         if(typeof chars == 'string'){
36119                 return chars.substr(start,length)
36120         }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
36121                 if(chars.length >= start+length || start){
36122                         return new java.lang.String(chars,start,length)+'';
36123                 }
36124                 return chars;
36125         }
36126   }
36127
36128   /*
36129    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
36130    * used method of org.xml.sax.ext.LexicalHandler:
36131    *  #comment(chars, start, length)
36132    *  #startCDATA()
36133    *  #endCDATA()
36134    *  #startDTD(name, publicId, systemId)
36135    *
36136    *
36137    * IGNORED method of org.xml.sax.ext.LexicalHandler:
36138    *  #endDTD()
36139    *  #startEntity(name)
36140    *  #endEntity(name)
36141    *
36142    *
36143    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
36144    * IGNORED method of org.xml.sax.ext.DeclHandler
36145    *    #attributeDecl(eName, aName, type, mode, value)
36146    *  #elementDecl(name, model)
36147    *  #externalEntityDecl(name, publicId, systemId)
36148    *  #internalEntityDecl(name, value)
36149    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
36150    * IGNORED method of org.xml.sax.EntityResolver2
36151    *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
36152    *  #resolveEntity(publicId, systemId)
36153    *  #getExternalSubset(name, baseURI)
36154    * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
36155    * IGNORED method of org.xml.sax.DTDHandler
36156    *  #notationDecl(name, publicId, systemId) {};
36157    *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
36158    */
36159   "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
36160         DOMHandler.prototype[key] = function(){return null};
36161   });
36162
36163   /* 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 */
36164   function appendElement (hander,node) {
36165       if (!hander.currentElement) {
36166           hander.doc.appendChild(node);
36167       } else {
36168           hander.currentElement.appendChild(node);
36169       }
36170   }//appendChild and setAttributeNS are preformance key
36171
36172   //if(typeof require == 'function'){
36173         var XMLReader = sax.XMLReader;
36174         var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation;
36175         exports.XMLSerializer = dom.XMLSerializer ;
36176         exports.DOMParser = DOMParser;
36177   //}
36178   });
36179   var domParser_1 = domParser.DOMImplementation;
36180   var domParser_2 = domParser.XMLSerializer;
36181   var domParser_3 = domParser.DOMParser;
36182
36183   var togeojson = createCommonjsModule(function (module, exports) {
36184   var toGeoJSON = (function() {
36185
36186       var removeSpace = /\s*/g,
36187           trimSpace = /^\s*|\s*$/g,
36188           splitSpace = /\s+/;
36189       // generate a short, numeric hash of a string
36190       function okhash(x) {
36191           if (!x || !x.length) return 0;
36192           for (var i = 0, h = 0; i < x.length; i++) {
36193               h = ((h << 5) - h) + x.charCodeAt(i) | 0;
36194           } return h;
36195       }
36196       // all Y children of X
36197       function get(x, y) { return x.getElementsByTagName(y); }
36198       function attr(x, y) { return x.getAttribute(y); }
36199       function attrf(x, y) { return parseFloat(attr(x, y)); }
36200       // one Y child of X, if any, otherwise null
36201       function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
36202       // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
36203       function norm(el) { if (el.normalize) { el.normalize(); } return el; }
36204       // cast array x into numbers
36205       function numarray(x) {
36206           for (var j = 0, o = []; j < x.length; j++) { o[j] = parseFloat(x[j]); }
36207           return o;
36208       }
36209       // get the content of a text node, if any
36210       function nodeVal(x) {
36211           if (x) { norm(x); }
36212           return (x && x.textContent) || '';
36213       }
36214       // get the contents of multiple text nodes, if present
36215       function getMulti(x, ys) {
36216           var o = {}, n, k;
36217           for (k = 0; k < ys.length; k++) {
36218               n = get1(x, ys[k]);
36219               if (n) o[ys[k]] = nodeVal(n);
36220           }
36221           return o;
36222       }
36223       // add properties of Y to X, overwriting if present in both
36224       function extend(x, y) { for (var k in y) x[k] = y[k]; }
36225       // get one coordinate from a coordinate array, if any
36226       function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
36227       // get all coordinates from a coordinate array as [[],[]]
36228       function coord(v) {
36229           var coords = v.replace(trimSpace, '').split(splitSpace),
36230               o = [];
36231           for (var i = 0; i < coords.length; i++) {
36232               o.push(coord1(coords[i]));
36233           }
36234           return o;
36235       }
36236       function coordPair(x) {
36237           var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
36238               ele = get1(x, 'ele'),
36239               // handle namespaced attribute in browser
36240               heartRate = get1(x, 'gpxtpx:hr') || get1(x, 'hr'),
36241               time = get1(x, 'time'),
36242               e;
36243           if (ele) {
36244               e = parseFloat(nodeVal(ele));
36245               if (!isNaN(e)) {
36246                   ll.push(e);
36247               }
36248           }
36249           return {
36250               coordinates: ll,
36251               time: time ? nodeVal(time) : null,
36252               heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
36253           };
36254       }
36255
36256       // create a new feature collection parent object
36257       function fc() {
36258           return {
36259               type: 'FeatureCollection',
36260               features: []
36261           };
36262       }
36263
36264       var serializer;
36265       if (typeof XMLSerializer !== 'undefined') {
36266           /* istanbul ignore next */
36267           serializer = new XMLSerializer();
36268       // only require xmldom in a node environment
36269       } else if (typeof process === 'object' && !process.browser) {
36270           serializer = new (domParser.XMLSerializer)();
36271       }
36272       function xml2str(str) {
36273           // IE9 will create a new XMLSerializer but it'll crash immediately.
36274           // This line is ignored because we don't run coverage tests in IE9
36275           /* istanbul ignore next */
36276           if (str.xml !== undefined) return str.xml;
36277           return serializer.serializeToString(str);
36278       }
36279
36280       var t = {
36281           kml: function(doc) {
36282
36283               var gj = fc(),
36284                   // styleindex keeps track of hashed styles in order to match features
36285                   styleIndex = {}, styleByHash = {},
36286                   // stylemapindex keeps track of style maps to expose in properties
36287                   styleMapIndex = {},
36288                   // atomic geospatial types supported by KML - MultiGeometry is
36289                   // handled separately
36290                   geotypes = ['Polygon', 'LineString', 'Point', 'Track', 'gx:Track'],
36291                   // all root placemarks in the file
36292                   placemarks = get(doc, 'Placemark'),
36293                   styles = get(doc, 'Style'),
36294                   styleMaps = get(doc, 'StyleMap');
36295
36296               for (var k = 0; k < styles.length; k++) {
36297                   var hash = okhash(xml2str(styles[k])).toString(16);
36298                   styleIndex['#' + attr(styles[k], 'id')] = hash;
36299                   styleByHash[hash] = styles[k];
36300               }
36301               for (var l = 0; l < styleMaps.length; l++) {
36302                   styleIndex['#' + attr(styleMaps[l], 'id')] = okhash(xml2str(styleMaps[l])).toString(16);
36303                   var pairs = get(styleMaps[l], 'Pair');
36304                   var pairsMap = {};
36305                   for (var m = 0; m < pairs.length; m++) {
36306                       pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
36307                   }
36308                   styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
36309
36310               }
36311               for (var j = 0; j < placemarks.length; j++) {
36312                   gj.features = gj.features.concat(getPlacemark(placemarks[j]));
36313               }
36314               function kmlColor(v) {
36315                   var color, opacity;
36316                   v = v || '';
36317                   if (v.substr(0, 1) === '#') { v = v.substr(1); }
36318                   if (v.length === 6 || v.length === 3) { color = v; }
36319                   if (v.length === 8) {
36320                       opacity = parseInt(v.substr(0, 2), 16) / 255;
36321                       color = '#' + v.substr(6, 2) +
36322                           v.substr(4, 2) +
36323                           v.substr(2, 2);
36324                   }
36325                   return [color, isNaN(opacity) ? undefined : opacity];
36326               }
36327               function gxCoord(v) { return numarray(v.split(' ')); }
36328               function gxCoords(root) {
36329                   var elems = get(root, 'coord', 'gx'), coords = [], times = [];
36330                   if (elems.length === 0) elems = get(root, 'gx:coord');
36331                   for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
36332                   var timeElems = get(root, 'when');
36333                   for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
36334                   return {
36335                       coords: coords,
36336                       times: times
36337                   };
36338               }
36339               function getGeometry(root) {
36340                   var geomNode, geomNodes, i, j, k, geoms = [], coordTimes = [];
36341                   if (get1(root, 'MultiGeometry')) { return getGeometry(get1(root, 'MultiGeometry')); }
36342                   if (get1(root, 'MultiTrack')) { return getGeometry(get1(root, 'MultiTrack')); }
36343                   if (get1(root, 'gx:MultiTrack')) { return getGeometry(get1(root, 'gx:MultiTrack')); }
36344                   for (i = 0; i < geotypes.length; i++) {
36345                       geomNodes = get(root, geotypes[i]);
36346                       if (geomNodes) {
36347                           for (j = 0; j < geomNodes.length; j++) {
36348                               geomNode = geomNodes[j];
36349                               if (geotypes[i] === 'Point') {
36350                                   geoms.push({
36351                                       type: 'Point',
36352                                       coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
36353                                   });
36354                               } else if (geotypes[i] === 'LineString') {
36355                                   geoms.push({
36356                                       type: 'LineString',
36357                                       coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
36358                                   });
36359                               } else if (geotypes[i] === 'Polygon') {
36360                                   var rings = get(geomNode, 'LinearRing'),
36361                                       coords = [];
36362                                   for (k = 0; k < rings.length; k++) {
36363                                       coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
36364                                   }
36365                                   geoms.push({
36366                                       type: 'Polygon',
36367                                       coordinates: coords
36368                                   });
36369                               } else if (geotypes[i] === 'Track' ||
36370                                   geotypes[i] === 'gx:Track') {
36371                                   var track = gxCoords(geomNode);
36372                                   geoms.push({
36373                                       type: 'LineString',
36374                                       coordinates: track.coords
36375                                   });
36376                                   if (track.times.length) coordTimes.push(track.times);
36377                               }
36378                           }
36379                       }
36380                   }
36381                   return {
36382                       geoms: geoms,
36383                       coordTimes: coordTimes
36384                   };
36385               }
36386               function getPlacemark(root) {
36387                   var geomsAndTimes = getGeometry(root), i, properties = {},
36388                       name = nodeVal(get1(root, 'name')),
36389                       address = nodeVal(get1(root, 'address')),
36390                       styleUrl = nodeVal(get1(root, 'styleUrl')),
36391                       description = nodeVal(get1(root, 'description')),
36392                       timeSpan = get1(root, 'TimeSpan'),
36393                       timeStamp = get1(root, 'TimeStamp'),
36394                       extendedData = get1(root, 'ExtendedData'),
36395                       lineStyle = get1(root, 'LineStyle'),
36396                       polyStyle = get1(root, 'PolyStyle'),
36397                       visibility = get1(root, 'visibility');
36398
36399                   if (!geomsAndTimes.geoms.length) return [];
36400                   if (name) properties.name = name;
36401                   if (address) properties.address = address;
36402                   if (styleUrl) {
36403                       if (styleUrl[0] !== '#') {
36404                           styleUrl = '#' + styleUrl;
36405                       }
36406
36407                       properties.styleUrl = styleUrl;
36408                       if (styleIndex[styleUrl]) {
36409                           properties.styleHash = styleIndex[styleUrl];
36410                       }
36411                       if (styleMapIndex[styleUrl]) {
36412                           properties.styleMapHash = styleMapIndex[styleUrl];
36413                           properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
36414                       }
36415                       // Try to populate the lineStyle or polyStyle since we got the style hash
36416                       var style = styleByHash[properties.styleHash];
36417                       if (style) {
36418                           if (!lineStyle) lineStyle = get1(style, 'LineStyle');
36419                           if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
36420                       }
36421                   }
36422                   if (description) properties.description = description;
36423                   if (timeSpan) {
36424                       var begin = nodeVal(get1(timeSpan, 'begin'));
36425                       var end = nodeVal(get1(timeSpan, 'end'));
36426                       properties.timespan = { begin: begin, end: end };
36427                   }
36428                   if (timeStamp) {
36429                       properties.timestamp = nodeVal(get1(timeStamp, 'when'));
36430                   }
36431                   if (lineStyle) {
36432                       var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
36433                           color = linestyles[0],
36434                           opacity = linestyles[1],
36435                           width = parseFloat(nodeVal(get1(lineStyle, 'width')));
36436                       if (color) properties.stroke = color;
36437                       if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
36438                       if (!isNaN(width)) properties['stroke-width'] = width;
36439                   }
36440                   if (polyStyle) {
36441                       var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
36442                           pcolor = polystyles[0],
36443                           popacity = polystyles[1],
36444                           fill = nodeVal(get1(polyStyle, 'fill')),
36445                           outline = nodeVal(get1(polyStyle, 'outline'));
36446                       if (pcolor) properties.fill = pcolor;
36447                       if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
36448                       if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
36449                       if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
36450                   }
36451                   if (extendedData) {
36452                       var datas = get(extendedData, 'Data'),
36453                           simpleDatas = get(extendedData, 'SimpleData');
36454
36455                       for (i = 0; i < datas.length; i++) {
36456                           properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
36457                       }
36458                       for (i = 0; i < simpleDatas.length; i++) {
36459                           properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
36460                       }
36461                   }
36462                   if (visibility) {
36463                       properties.visibility = nodeVal(visibility);
36464                   }
36465                   if (geomsAndTimes.coordTimes.length) {
36466                       properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
36467                           geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
36468                   }
36469                   var feature = {
36470                       type: 'Feature',
36471                       geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
36472                           type: 'GeometryCollection',
36473                           geometries: geomsAndTimes.geoms
36474                       },
36475                       properties: properties
36476                   };
36477                   if (attr(root, 'id')) feature.id = attr(root, 'id');
36478                   return [feature];
36479               }
36480               return gj;
36481           },
36482           gpx: function(doc) {
36483               var i,
36484                   tracks = get(doc, 'trk'),
36485                   routes = get(doc, 'rte'),
36486                   waypoints = get(doc, 'wpt'),
36487                   // a feature collection
36488                   gj = fc(),
36489                   feature;
36490               for (i = 0; i < tracks.length; i++) {
36491                   feature = getTrack(tracks[i]);
36492                   if (feature) gj.features.push(feature);
36493               }
36494               for (i = 0; i < routes.length; i++) {
36495                   feature = getRoute(routes[i]);
36496                   if (feature) gj.features.push(feature);
36497               }
36498               for (i = 0; i < waypoints.length; i++) {
36499                   gj.features.push(getPoint(waypoints[i]));
36500               }
36501               function getPoints(node, pointname) {
36502                   var pts = get(node, pointname),
36503                       line = [],
36504                       times = [],
36505                       heartRates = [],
36506                       l = pts.length;
36507                   if (l < 2) return {};  // Invalid line in GeoJSON
36508                   for (var i = 0; i < l; i++) {
36509                       var c = coordPair(pts[i]);
36510                       line.push(c.coordinates);
36511                       if (c.time) times.push(c.time);
36512                       if (c.heartRate) heartRates.push(c.heartRate);
36513                   }
36514                   return {
36515                       line: line,
36516                       times: times,
36517                       heartRates: heartRates
36518                   };
36519               }
36520               function getTrack(node) {
36521                   var segments = get(node, 'trkseg'),
36522                       track = [],
36523                       times = [],
36524                       heartRates = [],
36525                       line;
36526                   for (var i = 0; i < segments.length; i++) {
36527                       line = getPoints(segments[i], 'trkpt');
36528                       if (line) {
36529                           if (line.line) track.push(line.line);
36530                           if (line.times && line.times.length) times.push(line.times);
36531                           if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
36532                       }
36533                   }
36534                   if (track.length === 0) return;
36535                   var properties = getProperties(node);
36536                   extend(properties, getLineStyle(get1(node, 'extensions')));
36537                   if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
36538                   if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
36539                   return {
36540                       type: 'Feature',
36541                       properties: properties,
36542                       geometry: {
36543                           type: track.length === 1 ? 'LineString' : 'MultiLineString',
36544                           coordinates: track.length === 1 ? track[0] : track
36545                       }
36546                   };
36547               }
36548               function getRoute(node) {
36549                   var line = getPoints(node, 'rtept');
36550                   if (!line.line) return;
36551                   var prop = getProperties(node);
36552                   extend(prop, getLineStyle(get1(node, 'extensions')));
36553                   var routeObj = {
36554                       type: 'Feature',
36555                       properties: prop,
36556                       geometry: {
36557                           type: 'LineString',
36558                           coordinates: line.line
36559                       }
36560                   };
36561                   return routeObj;
36562               }
36563               function getPoint(node) {
36564                   var prop = getProperties(node);
36565                   extend(prop, getMulti(node, ['sym']));
36566                   return {
36567                       type: 'Feature',
36568                       properties: prop,
36569                       geometry: {
36570                           type: 'Point',
36571                           coordinates: coordPair(node).coordinates
36572                       }
36573                   };
36574               }
36575               function getLineStyle(extensions) {
36576                   var style = {};
36577                   if (extensions) {
36578                       var lineStyle = get1(extensions, 'line');
36579                       if (lineStyle) {
36580                           var color = nodeVal(get1(lineStyle, 'color')),
36581                               opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
36582                               width = parseFloat(nodeVal(get1(lineStyle, 'width')));
36583                           if (color) style.stroke = color;
36584                           if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
36585                           // GPX width is in mm, convert to px with 96 px per inch
36586                           if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
36587                       }
36588                   }
36589                   return style;
36590               }
36591               function getProperties(node) {
36592                   var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
36593                       links = get(node, 'link');
36594                   if (links.length) prop.links = [];
36595                   for (var i = 0, link; i < links.length; i++) {
36596                       link = { href: attr(links[i], 'href') };
36597                       extend(link, getMulti(links[i], ['text', 'type']));
36598                       prop.links.push(link);
36599                   }
36600                   return prop;
36601               }
36602               return gj;
36603           }
36604       };
36605       return t;
36606   })();
36607
36608   module.exports = toGeoJSON;
36609   });
36610
36611   var _initialized = false;
36612   var _enabled = false;
36613   var _geojson;
36614
36615
36616   function svgData(projection, context, dispatch) {
36617       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
36618       var _showLabels = true;
36619       var detected = utilDetect();
36620       var layer = select(null);
36621       var _vtService;
36622       var _fileList;
36623       var _template;
36624       var _src;
36625
36626
36627       function init() {
36628           if (_initialized) return;  // run once
36629
36630           _geojson = {};
36631           _enabled = true;
36632
36633           function over() {
36634               event.stopPropagation();
36635               event.preventDefault();
36636               event.dataTransfer.dropEffect = 'copy';
36637           }
36638
36639           select('body')
36640               .attr('dropzone', 'copy')
36641               .on('drop.svgData', function() {
36642                   event.stopPropagation();
36643                   event.preventDefault();
36644                   if (!detected.filedrop) return;
36645                   drawData.fileList(event.dataTransfer.files);
36646               })
36647               .on('dragenter.svgData', over)
36648               .on('dragexit.svgData', over)
36649               .on('dragover.svgData', over);
36650
36651           _initialized = true;
36652       }
36653
36654
36655       function getService() {
36656           if (services.vectorTile && !_vtService) {
36657               _vtService = services.vectorTile;
36658               _vtService.event.on('loadedData', throttledRedraw);
36659           } else if (!services.vectorTile && _vtService) {
36660               _vtService = null;
36661           }
36662
36663           return _vtService;
36664       }
36665
36666
36667       function showLayer() {
36668           layerOn();
36669
36670           layer
36671               .style('opacity', 0)
36672               .transition()
36673               .duration(250)
36674               .style('opacity', 1)
36675               .on('end', function () { dispatch.call('change'); });
36676       }
36677
36678
36679       function hideLayer() {
36680           throttledRedraw.cancel();
36681
36682           layer
36683               .transition()
36684               .duration(250)
36685               .style('opacity', 0)
36686               .on('end', layerOff);
36687       }
36688
36689
36690       function layerOn() {
36691           layer.style('display', 'block');
36692       }
36693
36694
36695       function layerOff() {
36696           layer.selectAll('.viewfield-group').remove();
36697           layer.style('display', 'none');
36698       }
36699
36700
36701       // ensure that all geojson features in a collection have IDs
36702       function ensureIDs(gj) {
36703           if (!gj) return null;
36704
36705           if (gj.type === 'FeatureCollection') {
36706               for (var i = 0; i < gj.features.length; i++) {
36707                   ensureFeatureID(gj.features[i]);
36708               }
36709           } else {
36710               ensureFeatureID(gj);
36711           }
36712           return gj;
36713       }
36714
36715
36716       // ensure that each single Feature object has a unique ID
36717       function ensureFeatureID(feature) {
36718           if (!feature) return;
36719           feature.__featurehash__ = utilHashcode(fastJsonStableStringify(feature));
36720           return feature;
36721       }
36722
36723
36724       // Prefer an array of Features instead of a FeatureCollection
36725       function getFeatures(gj) {
36726           if (!gj) return [];
36727
36728           if (gj.type === 'FeatureCollection') {
36729               return gj.features;
36730           } else {
36731               return [gj];
36732           }
36733       }
36734
36735
36736       function featureKey(d) {
36737           return d.__featurehash__;
36738       }
36739
36740
36741       function isPolygon(d) {
36742           return d.geometry.type === 'Polygon' || d.geometry.type === 'MultiPolygon';
36743       }
36744
36745
36746       function clipPathID(d) {
36747           return 'data-' + d.__featurehash__ + '-clippath';
36748       }
36749
36750
36751       function featureClasses(d) {
36752           return [
36753               'data' + d.__featurehash__,
36754               d.geometry.type,
36755               isPolygon(d) ? 'area' : '',
36756               d.__layerID__ || ''
36757           ].filter(Boolean).join(' ');
36758       }
36759
36760
36761       function drawData(selection) {
36762           var vtService = getService();
36763           var getPath = svgPath(projection).geojson;
36764           var getAreaPath = svgPath(projection, null, true).geojson;
36765           var hasData = drawData.hasData();
36766
36767           layer = selection.selectAll('.layer-mapdata')
36768               .data(_enabled && hasData ? [0] : []);
36769
36770           layer.exit()
36771               .remove();
36772
36773           layer = layer.enter()
36774               .append('g')
36775               .attr('class', 'layer-mapdata')
36776               .merge(layer);
36777
36778           var surface = context.surface();
36779           if (!surface || surface.empty()) return;  // not ready to draw yet, starting up
36780
36781
36782           // Gather data
36783           var geoData, polygonData;
36784           if (_template && vtService) {   // fetch data from vector tile service
36785               var sourceID = _template;
36786               vtService.loadTiles(sourceID, _template, projection);
36787               geoData = vtService.data(sourceID, projection);
36788           } else {
36789               geoData = getFeatures(_geojson);
36790           }
36791           geoData = geoData.filter(getPath);
36792           polygonData = geoData.filter(isPolygon);
36793
36794
36795           // Draw clip paths for polygons
36796           var clipPaths = surface.selectAll('defs').selectAll('.clipPath-data')
36797              .data(polygonData, featureKey);
36798
36799           clipPaths.exit()
36800              .remove();
36801
36802           var clipPathsEnter = clipPaths.enter()
36803              .append('clipPath')
36804              .attr('class', 'clipPath-data')
36805              .attr('id', clipPathID);
36806
36807           clipPathsEnter
36808              .append('path');
36809
36810           clipPaths.merge(clipPathsEnter)
36811              .selectAll('path')
36812              .attr('d', getAreaPath);
36813
36814
36815           // Draw fill, shadow, stroke layers
36816           var datagroups = layer
36817               .selectAll('g.datagroup')
36818               .data(['fill', 'shadow', 'stroke']);
36819
36820           datagroups = datagroups.enter()
36821               .append('g')
36822               .attr('class', function(d) { return 'datagroup datagroup-' + d; })
36823               .merge(datagroups);
36824
36825
36826           // Draw paths
36827           var pathData = {
36828               fill: polygonData,
36829               shadow: geoData,
36830               stroke: geoData
36831           };
36832
36833           var paths = datagroups
36834               .selectAll('path')
36835               .data(function(layer) { return pathData[layer]; }, featureKey);
36836
36837           // exit
36838           paths.exit()
36839               .remove();
36840
36841           // enter/update
36842           paths = paths.enter()
36843               .append('path')
36844               .attr('class', function(d) {
36845                   var datagroup = this.parentNode.__data__;
36846                   return 'pathdata ' + datagroup + ' ' + featureClasses(d);
36847               })
36848               .attr('clip-path', function(d) {
36849                   var datagroup = this.parentNode.__data__;
36850                   return datagroup === 'fill' ? ('url(#' + clipPathID(d) + ')') : null;
36851               })
36852               .merge(paths)
36853               .attr('d', function(d) {
36854                   var datagroup = this.parentNode.__data__;
36855                   return datagroup === 'fill' ? getAreaPath(d) : getPath(d);
36856               });
36857
36858
36859           // Draw labels
36860           layer
36861               .call(drawLabels, 'label-halo', geoData)
36862               .call(drawLabels, 'label', geoData);
36863
36864
36865           function drawLabels(selection, textClass, data) {
36866               var labelPath = d3_geoPath(projection);
36867               var labelData = data.filter(function(d) {
36868                   return _showLabels && d.properties && (d.properties.desc || d.properties.name);
36869               });
36870
36871               var labels = selection.selectAll('text.' + textClass)
36872                   .data(labelData, featureKey);
36873
36874               // exit
36875               labels.exit()
36876                   .remove();
36877
36878               // enter/update
36879               labels = labels.enter()
36880                   .append('text')
36881                   .attr('class', function(d) { return textClass + ' ' + featureClasses(d); })
36882                   .merge(labels)
36883                   .text(function(d) {
36884                       return d.properties.desc || d.properties.name;
36885                   })
36886                   .attr('x', function(d) {
36887                       var centroid = labelPath.centroid(d);
36888                       return centroid[0] + 11;
36889                   })
36890                   .attr('y', function(d) {
36891                       var centroid = labelPath.centroid(d);
36892                       return centroid[1];
36893                   });
36894           }
36895       }
36896
36897
36898       function getExtension(fileName) {
36899           if (!fileName) return;
36900
36901           var re = /\.(gpx|kml|(geo)?json)$/i;
36902           var match = fileName.toLowerCase().match(re);
36903           return match && match.length && match[0];
36904       }
36905
36906
36907       function xmlToDom(textdata) {
36908           return (new DOMParser()).parseFromString(textdata, 'text/xml');
36909       }
36910
36911
36912       drawData.setFile = function(extension, data) {
36913           _template = null;
36914           _fileList = null;
36915           _geojson = null;
36916           _src = null;
36917
36918           var gj;
36919           switch (extension) {
36920               case '.gpx':
36921                   gj = togeojson.gpx(xmlToDom(data));
36922                   break;
36923               case '.kml':
36924                   gj = togeojson.kml(xmlToDom(data));
36925                   break;
36926               case '.geojson':
36927               case '.json':
36928                   gj = JSON.parse(data);
36929                   break;
36930           }
36931
36932           if (!isEmpty(gj)) {
36933               _geojson = ensureIDs(gj);
36934               _src = extension + ' data file';
36935               this.fitZoom();
36936           }
36937
36938           dispatch.call('change');
36939           return this;
36940       };
36941
36942
36943       drawData.showLabels = function(val) {
36944           if (!arguments.length) return _showLabels;
36945
36946           _showLabels = val;
36947           return this;
36948       };
36949
36950
36951       drawData.enabled = function(val) {
36952           if (!arguments.length) return _enabled;
36953
36954           _enabled = val;
36955           if (_enabled) {
36956               showLayer();
36957           } else {
36958               hideLayer();
36959           }
36960
36961           dispatch.call('change');
36962           return this;
36963       };
36964
36965
36966       drawData.hasData = function() {
36967           return !!(_template || !isEmpty(_geojson));
36968       };
36969
36970
36971       drawData.template = function(val, src) {
36972           if (!arguments.length) return _template;
36973
36974           // test source against OSM imagery blacklists..
36975           var osm = context.connection();
36976           if (osm) {
36977               var blacklists = osm.imageryBlacklists();
36978               var fail = false;
36979               var tested = 0;
36980               var regex;
36981
36982               for (var i = 0; i < blacklists.length; i++) {
36983                   try {
36984                       regex = new RegExp(blacklists[i]);
36985                       fail = regex.test(val);
36986                       tested++;
36987                       if (fail) break;
36988                   } catch (e) {
36989                       /* noop */
36990                   }
36991               }
36992
36993               // ensure at least one test was run.
36994               if (!tested) {
36995                   regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
36996                   fail = regex.test(val);
36997               }
36998           }
36999
37000           _template = val;
37001           _fileList = null;
37002           _geojson = null;
37003
37004           // strip off the querystring/hash from the template,
37005           // it often includes the access token
37006           _src = src || ('vectortile:' + val.split(/[?#]/)[0]);
37007
37008           dispatch.call('change');
37009           return this;
37010       };
37011
37012
37013       drawData.geojson = function(gj, src) {
37014           if (!arguments.length) return _geojson;
37015
37016           _template = null;
37017           _fileList = null;
37018           _geojson = null;
37019           _src = null;
37020
37021           if (!isEmpty(gj)) {
37022               _geojson = ensureIDs(gj);
37023               _src = src || 'unknown.geojson';
37024           }
37025
37026           dispatch.call('change');
37027           return this;
37028       };
37029
37030
37031       drawData.fileList = function(fileList) {
37032           if (!arguments.length) return _fileList;
37033
37034           _template = null;
37035           _fileList = fileList;
37036           _geojson = null;
37037           _src = null;
37038
37039           if (!fileList || !fileList.length) return this;
37040           var f = fileList[0];
37041           var extension = getExtension(f.name);
37042           var reader = new FileReader();
37043           reader.onload = (function() {
37044               return function(e) {
37045                   drawData.setFile(extension, e.target.result);
37046               };
37047           })(f);
37048
37049           reader.readAsText(f);
37050
37051           return this;
37052       };
37053
37054
37055       drawData.url = function(url, defaultExtension) {
37056           _template = null;
37057           _fileList = null;
37058           _geojson = null;
37059           _src = null;
37060
37061           // strip off any querystring/hash from the url before checking extension
37062           var testUrl = url.split(/[?#]/)[0];
37063           var extension = getExtension(testUrl) || defaultExtension;
37064           if (extension) {
37065               _template = null;
37066               d3_text(url, function(err, data) {
37067                   if (err) return;
37068                   drawData.setFile(extension, data);
37069               });
37070           } else {
37071               drawData.template(url);
37072           }
37073
37074           return this;
37075       };
37076
37077
37078       drawData.getSrc = function() {
37079           return _src || '';
37080       };
37081
37082
37083       drawData.fitZoom = function() {
37084           var features = getFeatures(_geojson);
37085           if (!features.length) return;
37086
37087           var map = context.map();
37088           var viewport = map.trimmedExtent().polygon();
37089           var coords = reduce(features, function(coords, feature) {
37090               var c = feature.geometry.coordinates;
37091
37092               /* eslint-disable no-fallthrough */
37093               switch (feature.geometry.type) {
37094                   case 'Point':
37095                       c = [c];
37096                   case 'MultiPoint':
37097                   case 'LineString':
37098                       break;
37099
37100                   case 'MultiPolygon':
37101                       c = flatten(c);
37102                   case 'Polygon':
37103                   case 'MultiLineString':
37104                       c = flatten(c);
37105                       break;
37106               }
37107               /* eslint-enable no-fallthrough */
37108
37109               return union(coords, c);
37110           }, []);
37111
37112           if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
37113               var extent = geoExtent(d3_geoBounds({ type: 'LineString', coordinates: coords }));
37114               map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
37115           }
37116
37117           return this;
37118       };
37119
37120
37121       init();
37122       return drawData;
37123   }
37124
37125   function svgDebug(projection, context) {
37126
37127       function drawDebug(selection) {
37128           var showsTile = context.getDebug('tile');
37129           var showsCollision = context.getDebug('collision');
37130           var showsImagery = context.getDebug('imagery');
37131           var showsCommunity = context.getDebug('community');
37132           var showsImperial = context.getDebug('imperial');
37133           var showsDriveLeft = context.getDebug('driveLeft');
37134           var showsTouchTargets = context.getDebug('target');
37135
37136           var debugData = [];
37137           if (showsTile) {
37138               debugData.push({ class: 'red', label: 'tile' });
37139           }
37140           if (showsCollision) {
37141               debugData.push({ class: 'yellow', label: 'collision' });
37142           }
37143           if (showsImagery) {
37144               debugData.push({ class: 'orange', label: 'imagery' });
37145           }
37146           if (showsCommunity) {
37147               debugData.push({ class: 'blue', label: 'community' });
37148           }
37149           if (showsImperial) {
37150               debugData.push({ class: 'cyan', label: 'imperial' });
37151           }
37152           if (showsDriveLeft) {
37153               debugData.push({ class: 'green', label: 'driveLeft' });
37154           }
37155           if (showsTouchTargets) {
37156               debugData.push({ class: 'pink', label: 'touchTargets' });
37157           }
37158
37159
37160           var legend = select('#content')
37161               .selectAll('.debug-legend')
37162               .data(debugData.length ? [0] : []);
37163
37164           legend.exit()
37165               .remove();
37166
37167           legend = legend.enter()
37168               .append('div')
37169               .attr('class', 'fillD debug-legend')
37170               .merge(legend);
37171
37172
37173           var legendItems = legend.selectAll('.debug-legend-item')
37174               .data(debugData, function(d) { return d.label; });
37175
37176           legendItems.exit()
37177               .remove();
37178
37179           legendItems.enter()
37180               .append('span')
37181               .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
37182               .text(function(d) { return d.label; });
37183
37184
37185           var layer = selection.selectAll('.layer-debug')
37186               .data(showsImagery || showsCommunity || showsImperial || showsDriveLeft ? [0] : []);
37187
37188           layer.exit()
37189               .remove();
37190
37191           layer = layer.enter()
37192               .append('g')
37193               .attr('class', 'layer-debug')
37194               .merge(layer);
37195
37196
37197           var extent = context.map().extent();
37198           var matchImagery = (showsImagery && data.imagery.query.bbox(extent.rectangle(), true)) || [];
37199           var features = matchImagery.map(function(d) { return data.imagery.features[d.id]; });
37200
37201           var imagery = layer.selectAll('path.debug-imagery')
37202               .data(features);
37203
37204           imagery.exit()
37205               .remove();
37206
37207           imagery.enter()
37208               .append('path')
37209               .attr('class', 'debug-imagery debug orange');
37210
37211
37212           var community = layer.selectAll('path.debug-community')
37213               .data(showsCommunity ? values$1(data.community.features) : []);
37214
37215           community.exit()
37216               .remove();
37217
37218           community.enter()
37219               .append('path')
37220               .attr('class', 'debug-community debug blue');
37221
37222
37223           var imperial = layer
37224               .selectAll('path.debug-imperial')
37225               .data(showsImperial ? [dataImperial] : []);
37226
37227           imperial.exit()
37228               .remove();
37229
37230           imperial.enter()
37231               .append('path')
37232               .attr('class', 'debug-imperial debug cyan');
37233
37234
37235           var driveLeft = layer
37236               .selectAll('path.debug-drive-left')
37237               .data(showsDriveLeft ? [dataDriveLeft] : []);
37238
37239           driveLeft.exit()
37240               .remove();
37241
37242           driveLeft.enter()
37243               .append('path')
37244               .attr('class', 'debug-drive-left debug green');
37245
37246
37247           // update
37248           layer.selectAll('path')
37249               .attr('d', svgPath(projection).geojson);
37250       }
37251
37252
37253       // This looks strange because `enabled` methods on other layers are
37254       // chainable getter/setters, and this one is just a getter.
37255       drawDebug.enabled = function() {
37256           if (!arguments.length) {
37257               return context.getDebug('tile') ||
37258                   context.getDebug('collision') ||
37259                   context.getDebug('imagery') ||
37260                   context.getDebug('imperial') ||
37261                   context.getDebug('driveLeft') ||
37262                   context.getDebug('target');
37263           } else {
37264               return this;
37265           }
37266       };
37267
37268
37269       return drawDebug;
37270   }
37271
37272   /*
37273       A standalone SVG element that contains only a `defs` sub-element. To be
37274       used once globally, since defs IDs must be unique within a document.
37275   */
37276   function svgDefs(context) {
37277
37278       function drawDefs(selection) {
37279           var defs = selection.append('defs');
37280
37281           // add markers
37282           defs
37283               .append('marker')
37284               .attr('id', 'oneway-marker')
37285               .attr('viewBox', '0 0 10 5')
37286               .attr('refX', 2.5)
37287               .attr('refY', 2.5)
37288               .attr('markerWidth', 2)
37289               .attr('markerHeight', 2)
37290               .attr('markerUnits', 'strokeWidth')
37291               .attr('orient', 'auto')
37292               .append('path')
37293               .attr('class', 'oneway-marker-path')
37294               .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')
37295               .attr('stroke', 'none')
37296               .attr('fill', '#000')
37297               .attr('opacity', '0.75');
37298
37299           // SVG markers have to be given a colour where they're defined
37300           // (they can't inherit it from the line they're attached to),
37301           // so we need to manually define markers for each color of tag
37302           // (also, it's slightly nicer if we can control the
37303           // positioning for different tags)
37304           function addSidedMarker(name, color, offset) {
37305               defs
37306                   .append('marker')
37307                   .attr('id', 'sided-marker-' + name)
37308                   .attr('viewBox', '0 0 2 2')
37309                   .attr('refX', 1)
37310                   .attr('refY', -offset)
37311                   .attr('markerWidth', 1.5)
37312                   .attr('markerHeight', 1.5)
37313                   .attr('markerUnits', 'strokeWidth')
37314                   .attr('orient', 'auto')
37315                   .append('path')
37316                   .attr('class', 'sided-marker-path sided-marker-' + name + '-path')
37317                   .attr('d', 'M 0,0 L 1,1 L 2,0 z')
37318                   .attr('stroke', 'none')
37319                   .attr('fill', color);
37320           }
37321           addSidedMarker('natural', 'rgb(140, 208, 95)', 0);
37322           // for a coastline, the arrows are (somewhat unintuitively) on
37323           // the water side, so let's color them blue (with a gap) to
37324           // give a stronger indication
37325           addSidedMarker('coastline', '#77dede', 1);
37326           // barriers have a dashed line, and separating the triangle
37327           // from the line visually suits that
37328           addSidedMarker('barrier', '#ddd', 1);
37329           addSidedMarker('man_made', '#fff', 0);
37330
37331           defs
37332               .append('marker')
37333               .attr('id', 'viewfield-marker')
37334               .attr('viewBox', '0 0 16 16')
37335               .attr('refX', 8)
37336               .attr('refY', 16)
37337               .attr('markerWidth', 4)
37338               .attr('markerHeight', 4)
37339               .attr('markerUnits', 'strokeWidth')
37340               .attr('orient', 'auto')
37341               .append('path')
37342               .attr('class', 'viewfield-marker-path')
37343               .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')
37344               .attr('fill', '#333')
37345               .attr('fill-opacity', '0.75')
37346               .attr('stroke', '#fff')
37347               .attr('stroke-width', '0.5px')
37348               .attr('stroke-opacity', '0.75');
37349
37350           defs
37351               .append('marker')
37352               .attr('id', 'viewfield-marker-wireframe')
37353               .attr('viewBox', '0 0 16 16')
37354               .attr('refX', 8)
37355               .attr('refY', 16)
37356               .attr('markerWidth', 4)
37357               .attr('markerHeight', 4)
37358               .attr('markerUnits', 'strokeWidth')
37359               .attr('orient', 'auto')
37360               .append('path')
37361               .attr('class', 'viewfield-marker-path')
37362               .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')
37363               .attr('fill', 'none')
37364               .attr('stroke', '#fff')
37365               .attr('stroke-width', '0.5px')
37366               .attr('stroke-opacity', '0.75');
37367
37368           // add patterns
37369           var patterns = defs.selectAll('pattern')
37370               .data([
37371                   // pattern name, pattern image name
37372                   ['beach', 'dots'],
37373                   ['construction', 'construction'],
37374                   ['cemetery', 'cemetery'],
37375                   ['cemetery_christian', 'cemetery_christian'],
37376                   ['cemetery_buddhist', 'cemetery_buddhist'],
37377                   ['cemetery_muslim', 'cemetery_muslim'],
37378                   ['cemetery_jewish', 'cemetery_jewish'],
37379                   ['farmland', 'farmland'],
37380                   ['farmyard', 'farmyard'],
37381                   ['forest', 'forest'],
37382                   ['forest_broadleaved', 'forest_broadleaved'],
37383                   ['forest_needleleaved', 'forest_needleleaved'],
37384                   ['forest_leafless', 'forest_leafless'],
37385                   ['grass', 'grass'],
37386                   ['landfill', 'landfill'],
37387                   ['meadow', 'grass'],
37388                   ['orchard', 'orchard'],
37389                   ['pond', 'pond'],
37390                   ['quarry', 'quarry'],
37391                   ['scrub', 'bushes'],
37392                   ['vineyard', 'vineyard'],
37393                   ['water_standing', 'lines'],
37394                   ['waves', 'waves'],
37395                   ['wetland', 'wetland'],
37396                   ['wetland_marsh', 'wetland_marsh'],
37397                   ['wetland_swamp', 'wetland_swamp'],
37398                   ['wetland_bog', 'wetland_bog'],
37399                   ['wetland_reedbed', 'wetland_reedbed']
37400               ])
37401               .enter()
37402               .append('pattern')
37403               .attr('id', function (d) { return 'pattern-' + d[0]; })
37404               .attr('width', 32)
37405               .attr('height', 32)
37406               .attr('patternUnits', 'userSpaceOnUse');
37407
37408           patterns
37409               .append('rect')
37410               .attr('x', 0)
37411               .attr('y', 0)
37412               .attr('width', 32)
37413               .attr('height', 32)
37414               .attr('class', function (d) { return 'pattern-color-' + d[0]; });
37415
37416           patterns
37417               .append('image')
37418               .attr('x', 0)
37419               .attr('y', 0)
37420               .attr('width', 32)
37421               .attr('height', 32)
37422               .attr('xlink:href', function (d) {
37423                   return context.imagePath('pattern/' + d[1] + '.png');
37424               });
37425
37426           // add clip paths
37427           defs.selectAll('clipPath')
37428               .data([12, 18, 20, 32, 45])
37429               .enter()
37430               .append('clipPath')
37431               .attr('id', function (d) { return 'clip-square-' + d; })
37432               .append('rect')
37433               .attr('x', 0)
37434               .attr('y', 0)
37435               .attr('width', function (d) { return d; })
37436               .attr('height', function (d) { return d; });
37437
37438           // add symbol spritesheets
37439           defs
37440               .call(drawDefs.addSprites, [
37441                   'iD-sprite', 'maki-sprite', 'temaki-sprite', 'fa-sprite', 'community-sprite'
37442               ], true);
37443       }
37444
37445
37446       drawDefs.addSprites = function(selection, ids, overrideColors) {
37447           var spritesheets = selection.selectAll('.spritesheet');
37448           var currData = spritesheets.data();
37449           var data = uniq(currData.concat(ids));
37450
37451           spritesheets
37452               .data(data)
37453               .enter()
37454               .append('g')
37455               .attr('class', function(d) { return 'spritesheet spritesheet-' + d; })
37456               .each(function(d) {
37457                   var url = context.imagePath(d + '.svg');
37458                   var node = select(this).node();
37459                   request(url)
37460                       .mimeType('image/svg+xml')
37461                       .response(function(xhr) { return xhr.responseXML; })
37462                       .get(function(err, svg) {
37463                           if (err) return;
37464                           node.appendChild(
37465                               select(svg.documentElement).attr('id', d).node()
37466                           );
37467                           if (overrideColors && d !== 'iD-sprite') {   // allow icon colors to be overridden..
37468                               select(node).selectAll('path')
37469                                   .attr('fill', 'currentColor');
37470                           }
37471                       });
37472               });
37473       };
37474
37475
37476       return drawDefs;
37477   }
37478
37479   var _keepRightEnabled = false;
37480   var _keepRightService;
37481
37482
37483   function svgKeepRight(projection, context, dispatch) {
37484       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
37485       var minZoom = 12;
37486       var touchLayer = select(null);
37487       var drawLayer = select(null);
37488       var _keepRightVisible = false;
37489
37490
37491       function markerPath(selection, klass) {
37492           selection
37493               .attr('class', klass)
37494               .attr('transform', 'translate(-4, -24)')
37495               .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');
37496       }
37497
37498
37499       // Loosely-coupled keepRight service for fetching errors.
37500       function getService() {
37501           if (services.keepRight && !_keepRightService) {
37502               _keepRightService = services.keepRight;
37503               _keepRightService.on('loaded', throttledRedraw);
37504           } else if (!services.keepRight && _keepRightService) {
37505               _keepRightService = null;
37506           }
37507
37508           return _keepRightService;
37509       }
37510
37511
37512       // Show the errors
37513       function editOn() {
37514           if (!_keepRightVisible) {
37515               _keepRightVisible = true;
37516               drawLayer
37517                   .style('display', 'block');
37518           }
37519       }
37520
37521
37522       // Immediately remove the errors and their touch targets
37523       function editOff() {
37524           if (_keepRightVisible) {
37525               _keepRightVisible = false;
37526               drawLayer
37527                   .style('display', 'none');
37528               drawLayer.selectAll('.qa_error.keepRight')
37529                   .remove();
37530               touchLayer.selectAll('.qa_error.keepRight')
37531                   .remove();
37532           }
37533       }
37534
37535
37536       // Enable the layer.  This shows the errors and transitions them to visible.
37537       function layerOn() {
37538           editOn();
37539
37540           drawLayer
37541               .style('opacity', 0)
37542               .transition()
37543               .duration(250)
37544               .style('opacity', 1)
37545               .on('end interrupt', function () {
37546                   dispatch.call('change');
37547               });
37548       }
37549
37550
37551       // Disable the layer.  This transitions the layer invisible and then hides the errors.
37552       function layerOff() {
37553           throttledRedraw.cancel();
37554           drawLayer.interrupt();
37555           touchLayer.selectAll('.qa_error.keepRight')
37556               .remove();
37557
37558           drawLayer
37559               .transition()
37560               .duration(250)
37561               .style('opacity', 0)
37562               .on('end interrupt', function () {
37563                   editOff();
37564                   dispatch.call('change');
37565               });
37566       }
37567
37568
37569       // Update the error markers
37570       function updateMarkers() {
37571           if (!_keepRightVisible || !_keepRightEnabled) return;
37572
37573           var service = getService();
37574           var selectedID = context.selectedErrorID();
37575           var data = (service ? service.getErrors(projection) : []);
37576           var getTransform = svgPointTransform(projection);
37577
37578           // Draw markers..
37579           var markers = drawLayer.selectAll('.qa_error.keepRight')
37580               .data(data, function(d) { return d.id; });
37581
37582           // exit
37583           markers.exit()
37584               .remove();
37585
37586           // enter
37587           var markersEnter = markers.enter()
37588               .append('g')
37589               .attr('class', function(d) {
37590                   return [
37591                       'qa_error',
37592                       d.service,
37593                       'error_id-' + d.id,
37594                       'error_type-' + d.parent_error_type
37595                   ].join(' ');
37596               });
37597
37598           markersEnter
37599               .append('ellipse')
37600               .attr('cx', 0.5)
37601               .attr('cy', 1)
37602               .attr('rx', 6.5)
37603               .attr('ry', 3)
37604               .attr('class', 'stroke');
37605
37606           markersEnter
37607               .append('path')
37608               .call(markerPath, 'shadow');
37609
37610           markersEnter
37611               .append('use')
37612               .attr('class', 'qa_error-fill')
37613               .attr('width', '20px')
37614               .attr('height', '20px')
37615               .attr('x', '-8px')
37616               .attr('y', '-22px')
37617               .attr('xlink:href', '#iD-icon-bolt');
37618
37619           // update
37620           markers
37621               .merge(markersEnter)
37622               .sort(sortY)
37623               .classed('selected', function(d) { return d.id === selectedID; })
37624               .attr('transform', getTransform);
37625
37626
37627           // Draw targets..
37628           if (touchLayer.empty()) return;
37629           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
37630
37631           var targets = touchLayer.selectAll('.qa_error.keepRight')
37632               .data(data, function(d) { return d.id; });
37633
37634           // exit
37635           targets.exit()
37636               .remove();
37637
37638           // enter/update
37639           targets.enter()
37640               .append('rect')
37641               .attr('width', '20px')
37642               .attr('height', '20px')
37643               .attr('x', '-8px')
37644               .attr('y', '-22px')
37645               .merge(targets)
37646               .sort(sortY)
37647               .attr('class', function(d) {
37648                   return 'qa_error ' + d.service + ' target error_id-' + d.id + ' ' + fillClass;
37649               })
37650               .attr('transform', getTransform);
37651
37652
37653           function sortY(a, b) {
37654               return (a.id === selectedID) ? 1
37655                   : (b.id === selectedID) ? -1
37656                   : (a.severity === 'error' && b.severity !== 'error') ? 1
37657                   : (b.severity === 'error' && a.severity !== 'error') ? -1
37658                   : b.loc[1] - a.loc[1];
37659           }
37660       }
37661
37662
37663       // Draw the keepRight layer and schedule loading errors and updating markers.
37664       function drawKeepRight(selection) {
37665           var service = getService();
37666
37667           var surface = context.surface();
37668           if (surface && !surface.empty()) {
37669               touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
37670           }
37671
37672           drawLayer = selection.selectAll('.layer-keepRight')
37673               .data(service ? [0] : []);
37674
37675           drawLayer.exit()
37676               .remove();
37677
37678           drawLayer = drawLayer.enter()
37679               .append('g')
37680               .attr('class', 'layer-keepRight')
37681               .style('display', _keepRightEnabled ? 'block' : 'none')
37682               .merge(drawLayer);
37683
37684           if (_keepRightEnabled) {
37685               if (service && ~~context.map().zoom() >= minZoom) {
37686                   editOn();
37687                   service.loadErrors(projection);
37688                   updateMarkers();
37689               } else {
37690                   editOff();
37691               }
37692           }
37693       }
37694
37695
37696       // Toggles the layer on and off
37697       drawKeepRight.enabled = function(val) {
37698           if (!arguments.length) return _keepRightEnabled;
37699
37700           _keepRightEnabled = val;
37701           if (_keepRightEnabled) {
37702               layerOn();
37703           } else {
37704               layerOff();
37705               if (context.selectedErrorID()) {
37706                   context.enter(modeBrowse(context));
37707               }
37708           }
37709
37710           dispatch.call('change');
37711           return this;
37712       };
37713
37714
37715       drawKeepRight.supported = function() {
37716           return !!getService();
37717       };
37718
37719
37720       return drawKeepRight;
37721   }
37722
37723   function svgIcon(name, svgklass, useklass) {
37724       return function drawIcon(selection) {
37725           selection.selectAll('svg.icon')
37726               .data([0])
37727               .enter()
37728               .append('svg')
37729               .attr('class', 'icon ' + (svgklass || ''))
37730               .append('use')
37731               .attr('xlink:href', name)
37732               .attr('class', useklass);
37733       };
37734   }
37735
37736   // Touch targets control which other vertices we can drag a vertex onto.
37737   //
37738   // - the activeID - nope
37739   // - 1 away (adjacent) to the activeID - yes (vertices will be merged)
37740   // - 2 away from the activeID - nope (would create a self intersecting segment)
37741   // - all others on a linear way - yes
37742   // - all others on a closed way - nope (would create a self intersecting polygon)
37743   //
37744   // returns
37745   // 0 = active vertex - no touch/connect
37746   // 1 = passive vertex - yes touch/connect
37747   // 2 = adjacent vertex - yes but pay attention segmenting a line here
37748   //
37749   function svgPassiveVertex(node, graph, activeID) {
37750       if (!activeID) return 1;
37751       if (activeID === node.id) return 0;
37752
37753       var parents = graph.parentWays(node);
37754
37755       for (var i = 0; i < parents.length; i++) {
37756           var nodes = parents[i].nodes;
37757           var isClosed = parents[i].isClosed();
37758           for (var j = 0; j < nodes.length; j++) {   // find this vertex, look nearby
37759               if (nodes[j] === node.id) {
37760                   var ix1 = j - 2;
37761                   var ix2 = j - 1;
37762                   var ix3 = j + 1;
37763                   var ix4 = j + 2;
37764
37765                   if (isClosed) {  // wraparound if needed
37766                       var max = nodes.length - 1;
37767                       if (ix1 < 0)   ix1 = max + ix1;
37768                       if (ix2 < 0)   ix2 = max + ix2;
37769                       if (ix3 > max) ix3 = ix3 - max;
37770                       if (ix4 > max) ix4 = ix4 - max;
37771                   }
37772
37773                   if (nodes[ix1] === activeID) return 0;        // no - prevent self intersect
37774                   else if (nodes[ix2] === activeID) return 2;   // ok - adjacent
37775                   else if (nodes[ix3] === activeID) return 2;   // ok - adjacent
37776                   else if (nodes[ix4] === activeID) return 0;   // no - prevent self intersect
37777                   else if (isClosed && nodes.indexOf(activeID) !== -1) return 0;  // no - prevent self intersect
37778               }
37779           }
37780       }
37781
37782       return 1;   // ok
37783   }
37784
37785
37786   function svgMarkerSegments(projection, graph, dt,
37787                                     shouldReverse,
37788                                     bothDirections) {
37789       return function(entity) {
37790           var i = 0;
37791           var offset = dt;
37792           var segments = [];
37793           var clip = d3_geoIdentity().clipExtent(projection.clipExtent()).stream;
37794           var coordinates = graph.childNodes(entity).map(function(n) { return n.loc; });
37795           var a, b;
37796
37797           if (shouldReverse(entity)) {
37798               coordinates.reverse();
37799           }
37800
37801           geoStream({
37802               type: 'LineString',
37803               coordinates: coordinates
37804           }, projection.stream(clip({
37805               lineStart: function() {},
37806               lineEnd: function() { a = null; },
37807               point: function(x, y) {
37808                   b = [x, y];
37809
37810                   if (a) {
37811                       var span = geoVecLength(a, b) - offset;
37812
37813                       if (span >= 0) {
37814                           var heading = geoVecAngle(a, b);
37815                           var dx = dt * Math.cos(heading);
37816                           var dy = dt * Math.sin(heading);
37817                           var p = [
37818                               a[0] + offset * Math.cos(heading),
37819                               a[1] + offset * Math.sin(heading)
37820                           ];
37821
37822                           // gather coordinates
37823                           var coord = [a, p];
37824                           for (span -= dt; span >= 0; span -= dt) {
37825                               p = geoVecAdd(p, [dx, dy]);
37826                               coord.push(p);
37827                           }
37828                           coord.push(b);
37829
37830                           // generate svg paths
37831                           var segment = '';
37832                           var j;
37833
37834                           for (j = 0; j < coord.length; j++) {
37835                               segment += (j === 0 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
37836                           }
37837                           segments.push({ id: entity.id, index: i++, d: segment });
37838
37839                           if (bothDirections(entity)) {
37840                               segment = '';
37841                               for (j = coord.length - 1; j >= 0; j--) {
37842                                   segment += (j === coord.length - 1 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
37843                               }
37844                               segments.push({ id: entity.id, index: i++, d: segment });
37845                           }
37846                       }
37847
37848                       offset = -span;
37849                   }
37850
37851                   a = b;
37852               }
37853           })));
37854
37855           return segments;
37856       };
37857   }
37858
37859
37860   function svgPath(projection, graph, isArea) {
37861
37862       // Explanation of magic numbers:
37863       // "padding" here allows space for strokes to extend beyond the viewport,
37864       // so that the stroke isn't drawn along the edge of the viewport when
37865       // the shape is clipped.
37866       //
37867       // When drawing lines, pad viewport by 5px.
37868       // When drawing areas, pad viewport by 65px in each direction to allow
37869       // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
37870
37871       var cache = {};
37872       var padding = isArea ? 65 : 5;
37873       var viewport = projection.clipExtent();
37874       var paddedExtent = [
37875           [viewport[0][0] - padding, viewport[0][1] - padding],
37876           [viewport[1][0] + padding, viewport[1][1] + padding]
37877       ];
37878       var clip = d3_geoIdentity().clipExtent(paddedExtent).stream;
37879       var project = projection.stream;
37880       var path = d3_geoPath()
37881           .projection({stream: function(output) { return project(clip(output)); }});
37882
37883       var svgpath = function(entity) {
37884           if (entity.id in cache) {
37885               return cache[entity.id];
37886           } else {
37887               return cache[entity.id] = path(entity.asGeoJSON(graph));
37888           }
37889       };
37890
37891       svgpath.geojson = function(d) {
37892           if (d.__featurehash__ !== undefined) {
37893               if (d.__featurehash__ in cache) {
37894                   return cache[d.__featurehash__];
37895               } else {
37896                   return cache[d.__featurehash__] = path(d);
37897               }
37898           } else {
37899               return path(d);
37900           }
37901       };
37902
37903       return svgpath;
37904   }
37905
37906
37907   function svgPointTransform(projection) {
37908       var svgpoint = function(entity) {
37909           // http://jsperf.com/short-array-join
37910           var pt = projection(entity.loc);
37911           return 'translate(' + pt[0] + ',' + pt[1] + ')';
37912       };
37913
37914       svgpoint.geojson = function(d) {
37915           return svgpoint(d.properties.entity);
37916       };
37917
37918       return svgpoint;
37919   }
37920
37921
37922   function svgRelationMemberTags(graph) {
37923       return function(entity) {
37924           var tags = entity.tags;
37925           graph.parentRelations(entity).forEach(function(relation) {
37926               var type = relation.tags.type;
37927               if (type === 'multipolygon' || type === 'boundary') {
37928                   tags = assignIn({}, relation.tags, tags);
37929               }
37930           });
37931           return tags;
37932       };
37933   }
37934
37935
37936   function svgSegmentWay(way, graph, activeID) {
37937       // When there is no activeID, we can memoize this expensive computation
37938       if (activeID === undefined) {
37939           return graph.transient(way, 'waySegments', getWaySegments);
37940       } else {
37941           return getWaySegments();
37942       }
37943
37944       function getWaySegments() {
37945           var isActiveWay = (way.nodes.indexOf(activeID) !== -1);
37946           var features = { passive: [], active: [] };
37947           var start = {};
37948           var end = {};
37949           var node, type;
37950
37951           for (var i = 0; i < way.nodes.length; i++) {
37952               node = graph.entity(way.nodes[i]);
37953               type = svgPassiveVertex(node, graph, activeID);
37954               end = { node: node, type: type };
37955
37956               if (start.type !== undefined) {
37957                   if (start.node.id === activeID || end.node.id === activeID) ; else if (isActiveWay && (start.type === 2 || end.type === 2)) {   // one adjacent vertex
37958                       pushActive(start, end, i);
37959                   } else if (start.type === 0 && end.type === 0) {   // both active vertices
37960                       pushActive(start, end, i);
37961                   } else {
37962                       pushPassive(start, end, i);
37963                   }
37964               }
37965
37966               start = end;
37967           }
37968
37969           return features;
37970
37971           function pushActive(start, end, index) {
37972               features.active.push({
37973                   type: 'Feature',
37974                   id: way.id + '-' + index + '-nope',
37975                   properties: {
37976                       nope: true,
37977                       target: true,
37978                       entity: way,
37979                       nodes: [start.node, end.node],
37980                       index: index
37981                   },
37982                   geometry: {
37983                       type: 'LineString',
37984                       coordinates: [start.node.loc, end.node.loc]
37985                   }
37986               });
37987           }
37988
37989           function pushPassive(start, end, index) {
37990               features.passive.push({
37991                   type: 'Feature',
37992                   id: way.id + '-' + index,
37993                   properties: {
37994                       target: true,
37995                       entity: way,
37996                       nodes: [start.node, end.node],
37997                       index: index
37998                   },
37999                   geometry: {
38000                       type: 'LineString',
38001                       coordinates: [start.node.loc, end.node.loc]
38002                   }
38003               });
38004           }
38005       }
38006   }
38007
38008   function svgGeolocate(projection) {
38009       var layer = select(null);
38010       var _position;
38011
38012
38013       function init() {
38014           if (svgGeolocate.initialized) return;  // run once
38015           svgGeolocate.enabled = false;
38016           svgGeolocate.initialized = true;
38017       }
38018
38019       function showLayer() {
38020           layer.style('display', 'block');
38021       }
38022
38023
38024       function hideLayer() {
38025           layer
38026               .transition()
38027               .duration(250)
38028               .style('opacity', 0);
38029       }
38030
38031       function layerOn() {
38032           layer
38033               .style('opacity', 0)
38034               .transition()
38035               .duration(250)
38036               .style('opacity', 1);
38037
38038       }
38039
38040       function layerOff() {
38041           layer.style('display', 'none');
38042       }
38043
38044       function transform(d) {
38045           return svgPointTransform(projection)(d);
38046       }
38047
38048       function accuracy(accuracy, loc) { // converts accuracy to pixels...
38049           var degreesRadius = geoMetersToLat(accuracy),
38050               tangentLoc = [loc[0], loc[1] + degreesRadius],
38051               projectedTangent = projection(tangentLoc),
38052               projectedLoc = projection([loc[0], loc[1]]);
38053
38054           // southern most point will have higher pixel value...
38055          return Math.round(projectedLoc[1] - projectedTangent[1]).toString();
38056       }
38057
38058       function update() {
38059           var geolocation = { loc: [_position.coords.longitude, _position.coords.latitude] };
38060
38061           var groups = layer.selectAll('.geolocations').selectAll('.geolocation')
38062               .data([geolocation]);
38063
38064           groups.exit()
38065               .remove();
38066
38067           var pointsEnter = groups.enter()
38068               .append('g')
38069               .attr('class', 'geolocation');
38070
38071           pointsEnter
38072               .append('circle')
38073               .attr('id', 'geolocate-radius')
38074               .attr('dx', '0')
38075               .attr('dy', '0')
38076               .attr('fill', 'rgb(15,128,225)')
38077               .attr('fill-opacity', '0.3')
38078               .attr('r', '0');
38079
38080           pointsEnter
38081               .append('circle')
38082               .attr('dx', '0')
38083               .attr('dy', '0')
38084               .attr('fill', 'rgb(15,128,225)')
38085               .attr('stroke', 'white')
38086               .attr('stroke-width', '1.5')
38087               .attr('r', '6');
38088
38089           groups.merge(pointsEnter)
38090               .attr('transform', transform);
38091
38092           select('#geolocate-radius').attr('r', accuracy(_position.coords.accuracy, geolocation.loc));
38093       }
38094
38095       function drawLocation(selection) {
38096           var enabled = svgGeolocate.enabled;
38097
38098           layer = selection.selectAll('.layer-geolocate')
38099               .data([0]);
38100
38101           layer.exit()
38102               .remove();
38103
38104           var layerEnter = layer.enter()
38105               .append('g')
38106               .attr('class', 'layer-geolocate')
38107               .style('display', enabled ? 'block' : 'none');
38108
38109           layerEnter
38110               .append('g')
38111               .attr('class', 'geolocations');
38112
38113           layer = layerEnter
38114               .merge(layer);
38115
38116           if (enabled) {
38117               update();
38118           } else {
38119               layerOff();
38120           }
38121       }
38122
38123       drawLocation.enabled = function (position, enabled) {
38124           if (!arguments.length) return svgGeolocate.enabled;
38125           _position = position;
38126           svgGeolocate.enabled = enabled;
38127           if (svgGeolocate.enabled) {
38128               showLayer();
38129               layerOn();
38130           } else {
38131               hideLayer();
38132           }
38133           return this;
38134       };
38135
38136       init();
38137       return drawLocation;
38138   }
38139
38140   function svgLabels(projection, context) {
38141       var path = d3_geoPath(projection);
38142       var detected = utilDetect();
38143       var baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge');
38144       var _rdrawn = rbush_1();
38145       var _rskipped = rbush_1();
38146       var _textWidthCache = {};
38147       var _entitybboxes = {};
38148
38149       // Listed from highest to lowest priority
38150       var labelStack = [
38151           ['line', 'aeroway', '*', 12],
38152           ['line', 'highway', 'motorway', 12],
38153           ['line', 'highway', 'trunk', 12],
38154           ['line', 'highway', 'primary', 12],
38155           ['line', 'highway', 'secondary', 12],
38156           ['line', 'highway', 'tertiary', 12],
38157           ['line', 'highway', '*', 12],
38158           ['line', 'railway', '*', 12],
38159           ['line', 'waterway', '*', 12],
38160           ['area', 'aeroway', '*', 12],
38161           ['area', 'amenity', '*', 12],
38162           ['area', 'building', '*', 12],
38163           ['area', 'historic', '*', 12],
38164           ['area', 'leisure', '*', 12],
38165           ['area', 'man_made', '*', 12],
38166           ['area', 'natural', '*', 12],
38167           ['area', 'shop', '*', 12],
38168           ['area', 'tourism', '*', 12],
38169           ['area', 'camp_site', '*', 12],
38170           ['point', 'aeroway', '*', 10],
38171           ['point', 'amenity', '*', 10],
38172           ['point', 'building', '*', 10],
38173           ['point', 'historic', '*', 10],
38174           ['point', 'leisure', '*', 10],
38175           ['point', 'man_made', '*', 10],
38176           ['point', 'natural', '*', 10],
38177           ['point', 'shop', '*', 10],
38178           ['point', 'tourism', '*', 10],
38179           ['point', 'camp_site', '*', 10],
38180           ['line', 'name', '*', 12],
38181           ['area', 'name', '*', 12],
38182           ['point', 'name', '*', 10]
38183       ];
38184
38185
38186       function blacklisted(preset) {
38187           var noIcons = ['building', 'landuse', 'natural'];
38188           return some(noIcons, function(s) {
38189               return preset.id.indexOf(s) >= 0;
38190           });
38191       }
38192
38193
38194       function get(array, prop) {
38195           return function(d, i) { return array[i][prop]; };
38196       }
38197
38198
38199       function textWidth(text, size, elem) {
38200           var c = _textWidthCache[size];
38201           if (!c) c = _textWidthCache[size] = {};
38202
38203           if (c[text]) {
38204               return c[text];
38205
38206           } else if (elem) {
38207               c[text] = elem.getComputedTextLength();
38208               return c[text];
38209
38210           } else {
38211               var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
38212               if (str === null) {
38213                   return size / 3 * 2 * text.length;
38214               } else {
38215                   return size / 3 * (2 * text.length + str.length);
38216               }
38217           }
38218       }
38219
38220
38221       function drawLinePaths(selection, entities, filter, classes, labels) {
38222           var paths = selection.selectAll('path')
38223               .filter(filter)
38224               .data(entities, osmEntity.key);
38225
38226           // exit
38227           paths.exit()
38228               .remove();
38229
38230           // enter/update
38231           paths.enter()
38232               .append('path')
38233               .style('stroke-width', get(labels, 'font-size'))
38234               .attr('id', function(d) { return 'labelpath-' + d.id; })
38235               .attr('class', classes)
38236               .merge(paths)
38237               .attr('d', get(labels, 'lineString'));
38238       }
38239
38240
38241       function drawLineLabels(selection, entities, filter, classes, labels) {
38242           var texts = selection.selectAll('text.' + classes)
38243               .filter(filter)
38244               .data(entities, osmEntity.key);
38245
38246           // exit
38247           texts.exit()
38248               .remove();
38249
38250           // enter
38251           texts.enter()
38252               .append('text')
38253               .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
38254               .attr('dy', baselineHack ? '0.35em' : null)
38255               .append('textPath')
38256               .attr('class', 'textpath');
38257
38258           // update
38259           selection.selectAll('text.' + classes).selectAll('.textpath')
38260               .filter(filter)
38261               .data(entities, osmEntity.key)
38262               .attr('startOffset', '50%')
38263               .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
38264               .text(utilDisplayNameForPath);
38265       }
38266
38267
38268       function drawPointLabels(selection, entities, filter, classes, labels) {
38269           var texts = selection.selectAll('text.' + classes)
38270               .filter(filter)
38271               .data(entities, osmEntity.key);
38272
38273           // exit
38274           texts.exit()
38275               .remove();
38276
38277           // enter/update
38278           texts.enter()
38279               .append('text')
38280               .attr('class', function(d, i) {
38281                   return classes + ' ' + labels[i].classes + ' ' + d.id;
38282               })
38283               .merge(texts)
38284               .attr('x', get(labels, 'x'))
38285               .attr('y', get(labels, 'y'))
38286               .style('text-anchor', get(labels, 'textAnchor'))
38287               .text(utilDisplayName)
38288               .each(function(d, i) {
38289                   textWidth(utilDisplayName(d), labels[i].height, this);
38290               });
38291       }
38292
38293
38294       function drawAreaLabels(selection, entities, filter, classes, labels) {
38295           entities = entities.filter(hasText);
38296           labels = labels.filter(hasText);
38297           drawPointLabels(selection, entities, filter, classes, labels);
38298
38299           function hasText(d, i) {
38300               return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
38301           }
38302       }
38303
38304
38305       function drawAreaIcons(selection, entities, filter, classes, labels) {
38306           var icons = selection.selectAll('use.' + classes)
38307               .filter(filter)
38308               .data(entities, osmEntity.key);
38309
38310           // exit
38311           icons.exit()
38312               .remove();
38313
38314           // enter/update
38315           icons.enter()
38316               .append('use')
38317               .attr('class', 'icon ' + classes)
38318               .attr('width', '17px')
38319               .attr('height', '17px')
38320               .merge(icons)
38321               .attr('transform', get(labels, 'transform'))
38322               .attr('xlink:href', function(d) {
38323                   var preset = context.presets().match(d, context.graph());
38324                   var picon = preset && preset.icon;
38325
38326                   if (!picon) {
38327                       return '';
38328                   } else {
38329                       var isMaki = /^maki-/.test(picon);
38330                       return '#' + picon + (isMaki ? '-15' : '');
38331                   }
38332               });
38333       }
38334
38335
38336       function drawCollisionBoxes(selection, rtree, which) {
38337           var classes = 'debug ' + which + ' ' + (which === 'debug-skipped' ? 'orange' : 'yellow');
38338
38339           var gj = [];
38340           if (context.getDebug('collision')) {
38341               gj = rtree.all().map(function(d) {
38342                   return { type: 'Polygon', coordinates: [[
38343                       [d.minX, d.minY],
38344                       [d.maxX, d.minY],
38345                       [d.maxX, d.maxY],
38346                       [d.minX, d.maxY],
38347                       [d.minX, d.minY]
38348                   ]]};
38349               });
38350           }
38351
38352           var boxes = selection.selectAll('.' + which)
38353               .data(gj);
38354
38355           // exit
38356           boxes.exit()
38357               .remove();
38358
38359           // enter/update
38360           boxes.enter()
38361               .append('path')
38362               .attr('class', classes)
38363               .merge(boxes)
38364               .attr('d', d3_geoPath());
38365       }
38366
38367
38368       function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
38369           var wireframe = context.surface().classed('fill-wireframe');
38370           var zoom = geoScaleToZoom(projection.scale());
38371
38372           var labelable = [];
38373           var renderNodeAs = {};
38374           var i, j, k, entity, geometry;
38375
38376           for (i = 0; i < labelStack.length; i++) {
38377               labelable.push([]);
38378           }
38379
38380           if (fullRedraw) {
38381               _rdrawn.clear();
38382               _rskipped.clear();
38383               _entitybboxes = {};
38384
38385           } else {
38386               for (i = 0; i < entities.length; i++) {
38387                   entity = entities[i];
38388                   var toRemove = []
38389                       .concat(_entitybboxes[entity.id] || [])
38390                       .concat(_entitybboxes[entity.id + 'I'] || []);
38391
38392                   for (j = 0; j < toRemove.length; j++) {
38393                       _rdrawn.remove(toRemove[j]);
38394                       _rskipped.remove(toRemove[j]);
38395                   }
38396               }
38397           }
38398
38399           // Loop through all the entities to do some preprocessing
38400           for (i = 0; i < entities.length; i++) {
38401               entity = entities[i];
38402               geometry = entity.geometry(graph);
38403
38404               // Insert collision boxes around interesting points/vertices
38405               if (geometry === 'point' || (geometry === 'vertex' && isInterestingVertex(entity))) {
38406                   var hasDirections = entity.directions(graph, projection).length;
38407                   var markerPadding;
38408
38409                   if (!wireframe && geometry === 'point' && !(zoom >= 18 && hasDirections)) {
38410                       renderNodeAs[entity.id] = 'point';
38411                       markerPadding = 20;   // extra y for marker height
38412                   } else {
38413                       renderNodeAs[entity.id] = 'vertex';
38414                       markerPadding = 0;
38415                   }
38416
38417                   var coord = projection(entity.loc);
38418                   var nodePadding = 10;
38419                   var bbox = {
38420                       minX: coord[0] - nodePadding,
38421                       minY: coord[1] - nodePadding - markerPadding,
38422                       maxX: coord[0] + nodePadding,
38423                       maxY: coord[1] + nodePadding
38424                   };
38425
38426                   doInsert(bbox, entity.id + 'P');
38427               }
38428
38429               // From here on, treat vertices like points
38430               if (geometry === 'vertex') {
38431                   geometry = 'point';
38432               }
38433
38434               // Determine which entities are label-able
38435               var preset = geometry === 'area' && context.presets().match(entity, graph);
38436               var icon = preset && !blacklisted(preset) && preset.icon;
38437
38438               if (!icon && !utilDisplayName(entity))
38439                   continue;
38440
38441               for (k = 0; k < labelStack.length; k++) {
38442                   var matchGeom = labelStack[k][0];
38443                   var matchKey = labelStack[k][1];
38444                   var matchVal = labelStack[k][2];
38445                   var hasVal = entity.tags[matchKey];
38446
38447                   if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
38448                       labelable[k].push(entity);
38449                       break;
38450                   }
38451               }
38452           }
38453
38454           var positions = {
38455               point: [],
38456               line: [],
38457               area: []
38458           };
38459
38460           var labelled = {
38461               point: [],
38462               line: [],
38463               area: []
38464           };
38465
38466           // Try and find a valid label for labellable entities
38467           for (k = 0; k < labelable.length; k++) {
38468               var fontSize = labelStack[k][3];
38469
38470               for (i = 0; i < labelable[k].length; i++) {
38471                   entity = labelable[k][i];
38472                   geometry = entity.geometry(graph);
38473
38474                   var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName;
38475                   var name = getName(entity);
38476                   var width = name && textWidth(name, fontSize);
38477                   var p = null;
38478
38479                   if (geometry === 'point' || geometry === 'vertex') {
38480                       // no point or vertex labels in wireframe mode
38481                       // no vertex labels at low zooms (vertices have no icons)
38482                       if (wireframe) continue;
38483                       var renderAs = renderNodeAs[entity.id];
38484                       if (renderAs === 'vertex' && zoom < 17) continue;
38485
38486                       p = getPointLabel(entity, width, fontSize, renderAs);
38487
38488                   } else if (geometry === 'line') {
38489                       p = getLineLabel(entity, width, fontSize);
38490
38491                   } else if (geometry === 'area') {
38492                       p = getAreaLabel(entity, width, fontSize);
38493                   }
38494
38495                   if (p) {
38496                       if (geometry === 'vertex') { geometry = 'point'; }  // treat vertex like point
38497                       p.classes = geometry + ' tag-' + labelStack[k][1];
38498                       positions[geometry].push(p);
38499                       labelled[geometry].push(entity);
38500                   }
38501               }
38502           }
38503
38504
38505           function isInterestingVertex(entity) {
38506               var selectedIDs = context.selectedIDs();
38507
38508               return entity.hasInterestingTags() ||
38509                   entity.isEndpoint(graph) ||
38510                   entity.isConnected(graph) ||
38511                   selectedIDs.indexOf(entity.id) !== -1 ||
38512                   some(graph.parentWays(entity), function(parent) {
38513                       return selectedIDs.indexOf(parent.id) !== -1;
38514                   });
38515           }
38516
38517
38518           function getPointLabel(entity, width, height, geometry) {
38519               var y = (geometry === 'point' ? -12 : 0);
38520               var pointOffsets = {
38521                   ltr: [15, y, 'start'],
38522                   rtl: [-15, y, 'end']
38523               };
38524
38525               var coord = projection(entity.loc);
38526               var textPadding = 2;
38527               var offset = pointOffsets[textDirection];
38528               var p = {
38529                   height: height,
38530                   width: width,
38531                   x: coord[0] + offset[0],
38532                   y: coord[1] + offset[1],
38533                   textAnchor: offset[2]
38534               };
38535
38536               // insert a collision box for the text label..
38537               var bbox;
38538               if (textDirection === 'rtl') {
38539                   bbox = {
38540                       minX: p.x - width - textPadding,
38541                       minY: p.y - (height / 2) - textPadding,
38542                       maxX: p.x + textPadding,
38543                       maxY: p.y + (height / 2) + textPadding
38544                   };
38545               } else {
38546                   bbox = {
38547                       minX: p.x - textPadding,
38548                       minY: p.y - (height / 2) - textPadding,
38549                       maxX: p.x + width + textPadding,
38550                       maxY: p.y + (height / 2) + textPadding
38551                   };
38552               }
38553
38554               if (tryInsert([bbox], entity.id, true)) {
38555                   return p;
38556               }
38557           }
38558
38559
38560           function getLineLabel(entity, width, height) {
38561               var viewport = geoExtent(context.projection.clipExtent()).polygon();
38562               var points = map$3(graph.childNodes(entity), 'loc').map(projection);
38563               var length = geoPathLength(points);
38564
38565               if (length < width + 20) return;
38566
38567               // todo: properly clip points to viewport
38568
38569               // % along the line to attempt to place the label
38570               var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
38571                                  25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
38572               var padding = 3;
38573
38574               for (var i = 0; i < lineOffsets.length; i++) {
38575                   var offset = lineOffsets[i];
38576                   var middle = offset / 100 * length;
38577                   var start = middle - width / 2;
38578
38579                   if (start < 0 || start + width > length) continue;
38580
38581                   // generate subpath and ignore paths that are invalid or don't cross viewport.
38582                   var sub = subpath(points, start, start + width);
38583                   if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
38584                       continue;
38585                   }
38586
38587                   var isReverse = reverse(sub);
38588                   if (isReverse) {
38589                       sub = sub.reverse();
38590                   }
38591
38592                   var bboxes = [];
38593                   var boxsize = (height + 2) / 2;
38594
38595                   for (var j = 0; j < sub.length - 1; j++) {
38596                       var a = sub[j];
38597                       var b = sub[j + 1];
38598
38599                       // split up the text into small collision boxes
38600                       var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
38601
38602                       for (var box = 0; box < num; box++) {
38603                           var p = geoVecInterp(a, b, box / num);
38604                           var x0 = p[0] - boxsize - padding;
38605                           var y0 = p[1] - boxsize - padding;
38606                           var x1 = p[0] + boxsize + padding;
38607                           var y1 = p[1] + boxsize + padding;
38608
38609                           bboxes.push({
38610                               minX: Math.min(x0, x1),
38611                               minY: Math.min(y0, y1),
38612                               maxX: Math.max(x0, x1),
38613                               maxY: Math.max(y0, y1)
38614                           });
38615                       }
38616                   }
38617
38618                   if (tryInsert(bboxes, entity.id, false)) {   // accept this one
38619                       return {
38620                           'font-size': height + 2,
38621                           lineString: lineString(sub),
38622                           startOffset: offset + '%'
38623                       };
38624                   }
38625               }
38626
38627               function reverse(p) {
38628                   var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
38629                   return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
38630               }
38631
38632               function lineString(points) {
38633                   return 'M' + points.join('L');
38634               }
38635
38636               function subpath(points, from, to) {
38637                   var sofar = 0;
38638                   var start, end, i0, i1;
38639
38640                   for (var i = 0; i < points.length - 1; i++) {
38641                       var a = points[i];
38642                       var b = points[i + 1];
38643                       var current = geoVecLength(a, b);
38644                       var portion;
38645                       if (!start && sofar + current >= from) {
38646                           portion = (from - sofar) / current;
38647                           start = [
38648                               a[0] + portion * (b[0] - a[0]),
38649                               a[1] + portion * (b[1] - a[1])
38650                           ];
38651                           i0 = i + 1;
38652                       }
38653                       if (!end && sofar + current >= to) {
38654                           portion = (to - sofar) / current;
38655                           end = [
38656                               a[0] + portion * (b[0] - a[0]),
38657                               a[1] + portion * (b[1] - a[1])
38658                           ];
38659                           i1 = i + 1;
38660                       }
38661                       sofar += current;
38662                   }
38663
38664                   var result = points.slice(i0, i1);
38665                   result.unshift(start);
38666                   result.push(end);
38667                   return result;
38668               }
38669           }
38670
38671
38672           function getAreaLabel(entity, width, height) {
38673               var centroid = path.centroid(entity.asGeoJSON(graph, true));
38674               var extent = entity.extent(graph);
38675               var areaWidth = projection(extent[1])[0] - projection(extent[0])[0];
38676
38677               if (isNaN(centroid[0]) || areaWidth < 20) return;
38678
38679               var preset = context.presets().match(entity, context.graph());
38680               var picon = preset && preset.icon;
38681               var iconSize = 17;
38682               var padding = 2;
38683               var p = {};
38684
38685               if (picon) {  // icon and label..
38686                   if (addIcon()) {
38687                       addLabel(iconSize + padding);
38688                       return p;
38689                   }
38690               } else {   // label only..
38691                   if (addLabel(0)) {
38692                       return p;
38693                   }
38694               }
38695
38696
38697               function addIcon() {
38698                   var iconX = centroid[0] - (iconSize / 2);
38699                   var iconY = centroid[1] - (iconSize / 2);
38700                   var bbox = {
38701                       minX: iconX,
38702                       minY: iconY,
38703                       maxX: iconX + iconSize,
38704                       maxY: iconY + iconSize
38705                   };
38706
38707                   if (tryInsert([bbox], entity.id + 'I', true)) {
38708                       p.transform = 'translate(' + iconX + ',' + iconY + ')';
38709                       return true;
38710                   }
38711                   return false;
38712               }
38713
38714               function addLabel(yOffset) {
38715                   if (width && areaWidth >= width + 20) {
38716                       var labelX = centroid[0];
38717                       var labelY = centroid[1] + yOffset;
38718                       var bbox = {
38719                           minX: labelX - (width / 2) - padding,
38720                           minY: labelY - (height / 2) - padding,
38721                           maxX: labelX + (width / 2) + padding,
38722                           maxY: labelY + (height / 2) + padding
38723                       };
38724
38725                       if (tryInsert([bbox], entity.id, true)) {
38726                           p.x = labelX;
38727                           p.y = labelY;
38728                           p.textAnchor = 'middle';
38729                           p.height = height;
38730                           return true;
38731                       }
38732                   }
38733                   return false;
38734               }
38735           }
38736
38737
38738           // force insert a singular bounding box
38739           // singular box only, no array, id better be unique
38740           function doInsert(bbox, id) {
38741               bbox.id = id;
38742
38743               var oldbox = _entitybboxes[id];
38744               if (oldbox) {
38745                   _rdrawn.remove(oldbox);
38746               }
38747               _entitybboxes[id] = bbox;
38748               _rdrawn.insert(bbox);
38749           }
38750
38751
38752           function tryInsert(bboxes, id, saveSkipped) {
38753               var skipped = false;
38754
38755               for (var i = 0; i < bboxes.length; i++) {
38756                   var bbox = bboxes[i];
38757                   bbox.id = id;
38758
38759                   // Check that label is visible
38760                   if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
38761                       skipped = true;
38762                       break;
38763                   }
38764                   if (_rdrawn.collides(bbox)) {
38765                       skipped = true;
38766                       break;
38767                   }
38768               }
38769
38770               _entitybboxes[id] = bboxes;
38771
38772               if (skipped) {
38773                   if (saveSkipped) {
38774                       _rskipped.load(bboxes);
38775                   }
38776               } else {
38777                   _rdrawn.load(bboxes);
38778               }
38779
38780               return !skipped;
38781           }
38782
38783
38784           var layer = selection.selectAll('.layer-osm.labels');
38785           layer.selectAll('.labels-group')
38786               .data(['halo', 'label', 'debug'])
38787               .enter()
38788               .append('g')
38789               .attr('class', function(d) { return 'labels-group ' + d; });
38790
38791           var halo = layer.selectAll('.labels-group.halo');
38792           var label = layer.selectAll('.labels-group.label');
38793           var debug = layer.selectAll('.labels-group.debug');
38794
38795           // points
38796           drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
38797           drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
38798
38799           // lines
38800           drawLinePaths(layer, labelled.line, filter, '', positions.line);
38801           drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
38802           drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
38803
38804           // areas
38805           drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
38806           drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
38807           drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
38808           drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
38809
38810           // debug
38811           drawCollisionBoxes(debug, _rskipped, 'debug-skipped');
38812           drawCollisionBoxes(debug, _rdrawn, 'debug-drawn');
38813
38814           layer.call(filterLabels);
38815       }
38816
38817
38818       function filterLabels(selection) {
38819           var drawLayer = selection.selectAll('.layer-osm.labels');
38820           var layers = drawLayer.selectAll('.labels-group.halo, .labels-group.label');
38821
38822           layers.selectAll('.nolabel')
38823               .classed('nolabel', false);
38824
38825           var mouse = context.mouse();
38826           var graph = context.graph();
38827           var selectedIDs = context.selectedIDs();
38828           var ids = [];
38829           var pad, bbox;
38830
38831           // hide labels near the mouse
38832           if (mouse) {
38833               pad = 20;
38834               bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
38835               ids.push.apply(ids, map$3(_rdrawn.search(bbox), 'id'));
38836           }
38837
38838           // hide labels on selected nodes (they look weird when dragging / haloed)
38839           for (var i = 0; i < selectedIDs.length; i++) {
38840               var entity = graph.hasEntity(selectedIDs[i]);
38841               if (entity && entity.type === 'node') {
38842                   ids.push(selectedIDs[i]);
38843               }
38844           }
38845
38846           layers.selectAll(utilEntitySelector(ids))
38847               .classed('nolabel', true);
38848
38849
38850           // draw the mouse bbox if debugging is on..
38851           var debug = selection.selectAll('.labels-group.debug');
38852           var gj = [];
38853           if (context.getDebug('collision')) {
38854               gj = bbox ? [{
38855                   type: 'Polygon',
38856                   coordinates: [[
38857                       [bbox.minX, bbox.minY],
38858                       [bbox.maxX, bbox.minY],
38859                       [bbox.maxX, bbox.maxY],
38860                       [bbox.minX, bbox.maxY],
38861                       [bbox.minX, bbox.minY]
38862                   ]]
38863               }] : [];
38864           }
38865
38866           var box = debug.selectAll('.debug-mouse')
38867               .data(gj);
38868
38869           // exit
38870           box.exit()
38871               .remove();
38872
38873           // enter/update
38874           box.enter()
38875               .append('path')
38876               .attr('class', 'debug debug-mouse yellow')
38877               .merge(box)
38878               .attr('d', d3_geoPath());
38879       }
38880
38881
38882       var throttleFilterLabels = throttle(utilCallWhenIdle(filterLabels), 100);
38883
38884
38885       drawLabels.observe = function(selection) {
38886           var listener = function() { throttleFilterLabels(selection); };
38887           selection.on('mousemove.hidelabels', listener);
38888           context.on('enter.hidelabels', listener);
38889       };
38890
38891
38892       drawLabels.off = function(selection) {
38893           throttleFilterLabels.cancel();
38894           selection.on('mousemove.hidelabels', null);
38895           context.on('enter.hidelabels', null);
38896       };
38897
38898
38899       return drawLabels;
38900   }
38901
38902   var _improveOsmEnabled = false;
38903   var _errorService;
38904
38905
38906   function svgImproveOSM(projection, context, dispatch) {
38907       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
38908       var minZoom = 12;
38909       var touchLayer = select(null);
38910       var drawLayer = select(null);
38911       var _improveOsmVisible = false;
38912
38913       function markerPath(selection, klass) {
38914           selection
38915               .attr('class', klass)
38916               .attr('transform', 'translate(-10, -28)')
38917               .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');
38918       }
38919
38920
38921       // Loosely-coupled improveOSM service for fetching errors.
38922       function getService() {
38923           if (services.improveOSM && !_errorService) {
38924               _errorService = services.improveOSM;
38925               _errorService.on('loaded', throttledRedraw);
38926           } else if (!services.improveOSM && _errorService) {
38927               _errorService = null;
38928           }
38929
38930           return _errorService;
38931       }
38932
38933
38934       // Show the errors
38935       function editOn() {
38936           if (!_improveOsmVisible) {
38937               _improveOsmVisible = true;
38938               drawLayer
38939                   .style('display', 'block');
38940           }
38941       }
38942
38943
38944       // Immediately remove the errors and their touch targets
38945       function editOff() {
38946           if (_improveOsmVisible) {
38947               _improveOsmVisible = false;
38948               drawLayer
38949                   .style('display', 'none');
38950               drawLayer.selectAll('.qa_error.improveOSM')
38951                   .remove();
38952               touchLayer.selectAll('.qa_error.improveOSM')
38953                   .remove();
38954           }
38955       }
38956
38957
38958       // Enable the layer.  This shows the errors and transitions them to visible.
38959       function layerOn() {
38960           editOn();
38961
38962           drawLayer
38963               .style('opacity', 0)
38964               .transition()
38965               .duration(250)
38966               .style('opacity', 1)
38967               .on('end interrupt', function () {
38968                   dispatch.call('change');
38969               });
38970       }
38971
38972
38973       // Disable the layer.  This transitions the layer invisible and then hides the errors.
38974       function layerOff() {
38975           throttledRedraw.cancel();
38976           drawLayer.interrupt();
38977           touchLayer.selectAll('.qa_error.improveOSM')
38978               .remove();
38979
38980           drawLayer
38981               .transition()
38982               .duration(250)
38983               .style('opacity', 0)
38984               .on('end interrupt', function () {
38985                   editOff();
38986                   dispatch.call('change');
38987               });
38988       }
38989
38990
38991       // Update the error markers
38992       function updateMarkers() {
38993           if (!_improveOsmVisible || !_improveOsmEnabled) return;
38994
38995           var service = getService();
38996           var selectedID = context.selectedErrorID();
38997           var data = (service ? service.getErrors(projection) : []);
38998           var getTransform = svgPointTransform(projection);
38999
39000           // Draw markers..
39001           var markers = drawLayer.selectAll('.qa_error.improveOSM')
39002               .data(data, function(d) { return d.id; });
39003
39004           // exit
39005           markers.exit()
39006               .remove();
39007
39008           // enter
39009           var markersEnter = markers.enter()
39010               .append('g')
39011               .attr('class', function(d) {
39012                   return [
39013                       'qa_error',
39014                       d.service,
39015                       'error_id-' + d.id,
39016                       'error_type-' + d.error_type,
39017                       'category-' + d.category
39018                   ].join(' ');
39019               });
39020
39021           markersEnter
39022               .append('polygon')
39023               .call(markerPath, 'shadow');
39024
39025           markersEnter
39026               .append('ellipse')
39027               .attr('cx', 0)
39028               .attr('cy', 0)
39029               .attr('rx', 4.5)
39030               .attr('ry', 2)
39031               .attr('class', 'stroke');
39032
39033           markersEnter
39034               .append('polygon')
39035               .attr('fill', 'currentColor')
39036               .call(markerPath, 'qa_error-fill');
39037
39038           markersEnter
39039               .append('use')
39040               .attr('transform', 'translate(-5.5, -21)')
39041               .attr('class', 'icon-annotation')
39042               .attr('width', '11px')
39043               .attr('height', '11px')
39044               .attr('xlink:href', function(d) {
39045                   var picon = d.icon;
39046
39047                   if (!picon) {
39048                       return '';
39049                   } else {
39050                       var isMaki = /^maki-/.test(picon);
39051                       return '#' + picon + (isMaki ? '-11' : '');
39052                   }
39053               });
39054
39055           // update
39056           markers
39057               .merge(markersEnter)
39058               .sort(sortY)
39059               .classed('selected', function(d) { return d.id === selectedID; })
39060               .attr('transform', getTransform);
39061
39062
39063           // Draw targets..
39064           if (touchLayer.empty()) return;
39065           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
39066
39067           var targets = touchLayer.selectAll('.qa_error.improveOSM')
39068               .data(data, function(d) { return d.id; });
39069
39070           // exit
39071           targets.exit()
39072               .remove();
39073
39074           // enter/update
39075           targets.enter()
39076               .append('rect')
39077               .attr('width', '20px')
39078               .attr('height', '30px')
39079               .attr('x', '-10px')
39080               .attr('y', '-28px')
39081               .merge(targets)
39082               .sort(sortY)
39083               .attr('class', function(d) {
39084                   return 'qa_error ' + d.service + ' target error_id-' + d.id + ' ' + fillClass;
39085               })
39086               .attr('transform', getTransform);
39087
39088
39089           function sortY(a, b) {
39090               return (a.id === selectedID) ? 1
39091                   : (b.id === selectedID) ? -1
39092                   : b.loc[1] - a.loc[1];
39093           }
39094       }
39095
39096
39097       // Draw the ImproveOSM layer and schedule loading errors and updating markers.
39098       function drawImproveOSM(selection) {
39099           var service = getService();
39100
39101           var surface = context.surface();
39102           if (surface && !surface.empty()) {
39103               touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
39104           }
39105
39106           drawLayer = selection.selectAll('.layer-improveOSM')
39107               .data(service ? [0] : []);
39108
39109           drawLayer.exit()
39110               .remove();
39111
39112           drawLayer = drawLayer.enter()
39113               .append('g')
39114               .attr('class', 'layer-improveOSM')
39115               .style('display', _improveOsmEnabled ? 'block' : 'none')
39116               .merge(drawLayer);
39117
39118           if (_improveOsmEnabled) {
39119               if (service && ~~context.map().zoom() >= minZoom) {
39120                   editOn();
39121                   service.loadErrors(projection);
39122                   updateMarkers();
39123               } else {
39124                   editOff();
39125               }
39126           }
39127       }
39128
39129
39130       // Toggles the layer on and off
39131       drawImproveOSM.enabled = function(val) {
39132           if (!arguments.length) return _improveOsmEnabled;
39133
39134           _improveOsmEnabled = val;
39135           if (_improveOsmEnabled) {
39136               layerOn();
39137           } else {
39138               layerOff();
39139               if (context.selectedErrorID()) {
39140                   context.enter(modeBrowse(context));
39141               }
39142           }
39143
39144           dispatch.call('change');
39145           return this;
39146       };
39147
39148
39149       drawImproveOSM.supported = function() {
39150           return !!getService();
39151       };
39152
39153
39154       return drawImproveOSM;
39155   }
39156
39157   function svgStreetside(projection, context, dispatch) {
39158       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
39159       var minZoom = 14;
39160       var minMarkerZoom = 16;
39161       var minViewfieldZoom = 18;
39162       var layer = select(null);
39163       var _viewerYaw = 0;
39164       var _selectedSequence = null;
39165       var _streetside;
39166
39167       /**
39168        * init().
39169        */
39170       function init() {
39171           if (svgStreetside.initialized) return;  // run once
39172           svgStreetside.enabled = false;
39173           svgStreetside.initialized = true;
39174       }
39175
39176       /**
39177        * getService().
39178        */
39179       function getService() {
39180           if (services.streetside && !_streetside) {
39181               _streetside = services.streetside;
39182               _streetside.event
39183                   .on('viewerChanged', viewerChanged)
39184                   .on('loadedBubbles', throttledRedraw);
39185           } else if (!services.streetside && _streetside) {
39186               _streetside = null;
39187           }
39188
39189           return _streetside;
39190       }
39191
39192       /**
39193        * showLayer().
39194        */
39195       function showLayer() {
39196           var service = getService();
39197           if (!service) return;
39198
39199           service.loadViewer(context);
39200           editOn();
39201
39202           layer
39203               .style('opacity', 0)
39204               .transition()
39205               .duration(250)
39206               .style('opacity', 1)
39207               .on('end', function () { dispatch.call('change'); });
39208       }
39209
39210       /**
39211        * hideLayer().
39212        */
39213       function hideLayer() {
39214           throttledRedraw.cancel();
39215
39216           layer
39217               .transition()
39218               .duration(250)
39219               .style('opacity', 0)
39220               .on('end', editOff);
39221       }
39222
39223       /**
39224        * editOn().
39225        */
39226       function editOn() {
39227           layer.style('display', 'block');
39228       }
39229
39230       /**
39231        * editOff().
39232        */
39233       function editOff() {
39234           layer.selectAll('.viewfield-group').remove();
39235           layer.style('display', 'none');
39236       }
39237
39238       /**
39239        * click() Handles 'bubble' point click event.
39240        */
39241       function click(d) {
39242           var service = getService();
39243           if (!service) return;
39244
39245           // try to preserve the viewer rotation when staying on the same sequence
39246           if (d.sequenceKey !== _selectedSequence) {
39247               _viewerYaw = 0;  // reset
39248           }
39249           _selectedSequence = d.sequenceKey;
39250
39251           service
39252               .selectImage(d)
39253               .then(function(r) {
39254                   if (r.status === 'ok'){
39255                       service.showViewer(_viewerYaw);
39256                   }
39257               });
39258
39259
39260           context.map().centerEase(d.loc);
39261       }
39262
39263       /**
39264        * mouseover().
39265        */
39266       function mouseover(d) {
39267           var service = getService();
39268           if (service) service.setStyles(d);
39269       }
39270
39271       /**
39272        * mouseout().
39273        */
39274       function mouseout() {
39275           var service = getService();
39276           if (service) service.setStyles(null);
39277       }
39278
39279       /**
39280        * transform().
39281        */
39282       function transform(d) {
39283           var t = svgPointTransform(projection)(d);
39284           var rot = d.ca + _viewerYaw;
39285           if (rot) {
39286               t += ' rotate(' + Math.floor(rot) + ',0,0)';
39287           }
39288           return t;
39289       }
39290
39291
39292       function viewerChanged() {
39293           var service = getService();
39294           if (!service) return;
39295
39296           var viewer = service.viewer();
39297           if (!viewer) return;
39298
39299           // update viewfield rotation
39300           _viewerYaw = viewer.getYaw();
39301
39302           // avoid updating if the map is currently transformed
39303           // e.g. during drags or easing.
39304           if (context.map().isTransformed()) return;
39305
39306           layer.selectAll('.viewfield-group.currentView')
39307               .attr('transform', transform);
39308       }
39309
39310
39311       /**
39312        * update().
39313        */
39314       function update() {
39315           var viewer = select('#photoviewer');
39316           var selected = viewer.empty() ? undefined : viewer.datum();
39317           var z = ~~context.map().zoom();
39318           var showMarkers = (z >= minMarkerZoom);
39319           var showViewfields = (z >= minViewfieldZoom);
39320           var service = getService();
39321
39322           var sequences = (service ? service.sequences(projection) : []);
39323           var bubbles = (service && showMarkers ? service.bubbles(projection) : []);
39324
39325           var traces = layer.selectAll('.sequences').selectAll('.sequence')
39326               .data(sequences, function(d) { return d.properties.key; });
39327
39328           // exit
39329           traces.exit()
39330               .remove();
39331
39332           // enter/update
39333           traces = traces.enter()
39334               .append('path')
39335               .attr('class', 'sequence')
39336               .merge(traces)
39337               .attr('d', svgPath(projection).geojson);
39338
39339
39340           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
39341               .data(bubbles, function(d) {
39342                   // force reenter once bubbles are attached to a sequence
39343                   return d.key + (d.sequenceKey ? 'v1' : 'v0');
39344               });
39345
39346           // exit
39347           groups.exit()
39348               .remove();
39349
39350           // enter
39351           var groupsEnter = groups.enter()
39352               .append('g')
39353               .attr('class', 'viewfield-group')
39354               .on('mouseenter', mouseover)
39355               .on('mouseleave', mouseout)
39356               .on('click', click);
39357
39358           groupsEnter
39359               .append('g')
39360               .attr('class', 'viewfield-scale');
39361
39362           // update
39363           var markers = groups
39364               .merge(groupsEnter)
39365               .sort(function(a, b) {
39366                   return (a === selected) ? 1
39367                       : (b === selected) ? -1
39368                       : b.loc[1] - a.loc[1];
39369               })
39370               .attr('transform', transform)
39371               .select('.viewfield-scale');
39372
39373
39374           markers.selectAll('circle')
39375               .data([0])
39376               .enter()
39377               .append('circle')
39378               .attr('dx', '0')
39379               .attr('dy', '0')
39380               .attr('r', '6');
39381
39382           var viewfields = markers.selectAll('.viewfield')
39383               .data(showViewfields ? [0] : []);
39384
39385           viewfields.exit()
39386               .remove();
39387
39388           // viewfields may or may not be drawn...
39389           // but if they are, draw below the circles
39390           viewfields.enter()
39391               .insert('path', 'circle')
39392               .attr('class', 'viewfield')
39393               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
39394               .attr('d', viewfieldPath);
39395
39396           function viewfieldPath() {
39397               var d = this.parentNode.__data__;
39398               if (d.pano) {
39399                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
39400               } else {
39401                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
39402               }
39403           }
39404
39405       }
39406
39407       /**
39408        * drawImages()
39409        * drawImages is the method that is returned (and that runs) everytime 'svgStreetside()' is called.
39410        * 'svgStreetside()' is called from index.js
39411        */
39412       function drawImages(selection) {
39413           var enabled = svgStreetside.enabled;
39414           var service = getService();
39415
39416           layer = selection.selectAll('.layer-streetside-images')
39417               .data(service ? [0] : []);
39418
39419           layer.exit()
39420               .remove();
39421
39422           var layerEnter = layer.enter()
39423               .append('g')
39424               .attr('class', 'layer-streetside-images')
39425               .style('display', enabled ? 'block' : 'none');
39426
39427           layerEnter
39428               .append('g')
39429               .attr('class', 'sequences');
39430
39431           layerEnter
39432               .append('g')
39433               .attr('class', 'markers');
39434
39435           layer = layerEnter
39436               .merge(layer);
39437
39438           if (enabled) {
39439               if (service && ~~context.map().zoom() >= minZoom) {
39440                   editOn();
39441                   update();
39442                   service.loadBubbles(projection);
39443               } else {
39444                   editOff();
39445               }
39446           }
39447       }
39448
39449
39450       /**
39451        * drawImages.enabled().
39452        */
39453       drawImages.enabled = function(_) {
39454           if (!arguments.length) return svgStreetside.enabled;
39455           svgStreetside.enabled = _;
39456           if (svgStreetside.enabled) {
39457               showLayer();
39458           } else {
39459               hideLayer();
39460           }
39461           dispatch.call('change');
39462           return this;
39463       };
39464
39465       /**
39466        * drawImages.supported().
39467        */
39468       drawImages.supported = function() {
39469           return !!getService();
39470       };
39471
39472       init();
39473
39474       return drawImages;
39475   }
39476
39477   function svgMapillaryImages(projection, context, dispatch) {
39478       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
39479       var minZoom = 12;
39480       var minMarkerZoom = 16;
39481       var minViewfieldZoom = 18;
39482       var layer = select(null);
39483       var _mapillary;
39484       var viewerCompassAngle;
39485
39486
39487       function init() {
39488           if (svgMapillaryImages.initialized) return;  // run once
39489           svgMapillaryImages.enabled = false;
39490           svgMapillaryImages.initialized = true;
39491       }
39492
39493
39494       function getService() {
39495           if (services.mapillary && !_mapillary) {
39496               _mapillary = services.mapillary;
39497               _mapillary.event.on('loadedImages', throttledRedraw);
39498               _mapillary.event.on('bearingChanged', function(e) {
39499                   viewerCompassAngle = e;
39500
39501                   // avoid updating if the map is currently transformed
39502                   // e.g. during drags or easing.
39503                   if (context.map().isTransformed()) return;
39504
39505                   layer.selectAll('.viewfield-group.currentView')
39506                       .filter(function(d) {
39507                           return d.pano;
39508                       })
39509                       .attr('transform', transform);
39510               });
39511           } else if (!services.mapillary && _mapillary) {
39512               _mapillary = null;
39513           }
39514
39515           return _mapillary;
39516       }
39517
39518
39519       function showLayer() {
39520           var service = getService();
39521           if (!service) return;
39522
39523           service.loadViewer(context);
39524           editOn();
39525
39526           layer
39527               .style('opacity', 0)
39528               .transition()
39529               .duration(250)
39530               .style('opacity', 1)
39531               .on('end', function () { dispatch.call('change'); });
39532       }
39533
39534
39535       function hideLayer() {
39536           throttledRedraw.cancel();
39537
39538           layer
39539               .transition()
39540               .duration(250)
39541               .style('opacity', 0)
39542               .on('end', editOff);
39543       }
39544
39545
39546       function editOn() {
39547           layer.style('display', 'block');
39548       }
39549
39550
39551       function editOff() {
39552           layer.selectAll('.viewfield-group').remove();
39553           layer.style('display', 'none');
39554       }
39555
39556
39557       function click(d) {
39558           var service = getService();
39559           if (!service) return;
39560
39561           service
39562               .selectImage(d)
39563               .updateViewer(d.key, context)
39564               .showViewer();
39565
39566           context.map().centerEase(d.loc);
39567       }
39568
39569
39570       function mouseover(d) {
39571           var service = getService();
39572           if (service) service.setStyles(d);
39573       }
39574
39575
39576       function mouseout() {
39577           var service = getService();
39578           if (service) service.setStyles(null);
39579       }
39580
39581
39582       function transform(d) {
39583           var t = svgPointTransform(projection)(d);
39584           if (d.pano && isNumber(viewerCompassAngle)) {
39585               t += ' rotate(' + Math.floor(viewerCompassAngle) + ',0,0)';
39586           } else if (d.ca) {
39587               t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
39588           }
39589           return t;
39590       }
39591
39592
39593       function update() {
39594           var viewer = select('#photoviewer');
39595           var selected = viewer.empty() ? undefined : viewer.datum();
39596
39597           var z = ~~context.map().zoom();
39598           var showMarkers = (z >= minMarkerZoom);
39599           var showViewfields = (z >= minViewfieldZoom);
39600
39601           var service = getService();
39602           var sequences = (service ? service.sequences(projection) : []);
39603           var images = (service && showMarkers ? service.images(projection) : []);
39604
39605           var traces = layer.selectAll('.sequences').selectAll('.sequence')
39606               .data(sequences, function(d) { return d.properties.key; });
39607
39608           // exit
39609           traces.exit()
39610               .remove();
39611
39612           // enter/update
39613           traces = traces.enter()
39614               .append('path')
39615               .attr('class', 'sequence')
39616               .merge(traces)
39617               .attr('d', svgPath(projection).geojson);
39618
39619
39620           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
39621               .data(images, function(d) { return d.key; });
39622
39623           // exit
39624           groups.exit()
39625               .remove();
39626
39627           // enter
39628           var groupsEnter = groups.enter()
39629               .append('g')
39630               .attr('class', 'viewfield-group')
39631               .on('mouseenter', mouseover)
39632               .on('mouseleave', mouseout)
39633               .on('click', click);
39634
39635           groupsEnter
39636               .append('g')
39637               .attr('class', 'viewfield-scale');
39638
39639           // update
39640           var markers = groups
39641               .merge(groupsEnter)
39642               .sort(function(a, b) {
39643                   return (a === selected) ? 1
39644                       : (b === selected) ? -1
39645                       : b.loc[1] - a.loc[1];  // sort Y
39646               })
39647               .attr('transform', transform)
39648               .select('.viewfield-scale');
39649
39650
39651           markers.selectAll('circle')
39652               .data([0])
39653               .enter()
39654               .append('circle')
39655               .attr('dx', '0')
39656               .attr('dy', '0')
39657               .attr('r', '6');
39658
39659           var viewfields = markers.selectAll('.viewfield')
39660               .data(showViewfields ? [0] : []);
39661
39662           viewfields.exit()
39663               .remove();
39664
39665           viewfields.enter()               // viewfields may or may not be drawn...
39666               .insert('path', 'circle')    // but if they are, draw below the circles
39667               .attr('class', 'viewfield')
39668               .classed('pano', function() { return this.parentNode.__data__.pano; })
39669               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
39670               .attr('d', viewfieldPath);
39671
39672           function viewfieldPath() {
39673               var d = this.parentNode.__data__;
39674               if (d.pano) {
39675                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
39676               } else {
39677                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
39678               }
39679           }
39680       }
39681
39682
39683       function drawImages(selection) {
39684           var enabled = svgMapillaryImages.enabled;
39685           var service = getService();
39686
39687           layer = selection.selectAll('.layer-mapillary-images')
39688               .data(service ? [0] : []);
39689
39690           layer.exit()
39691               .remove();
39692
39693           var layerEnter = layer.enter()
39694               .append('g')
39695               .attr('class', 'layer-mapillary-images')
39696               .style('display', enabled ? 'block' : 'none');
39697
39698           layerEnter
39699               .append('g')
39700               .attr('class', 'sequences');
39701
39702           layerEnter
39703               .append('g')
39704               .attr('class', 'markers');
39705
39706           layer = layerEnter
39707               .merge(layer);
39708
39709           if (enabled) {
39710               if (service && ~~context.map().zoom() >= minZoom) {
39711                   editOn();
39712                   update();
39713                   service.loadImages(projection);
39714               } else {
39715                   editOff();
39716               }
39717           }
39718       }
39719
39720
39721       drawImages.enabled = function(_) {
39722           if (!arguments.length) return svgMapillaryImages.enabled;
39723           svgMapillaryImages.enabled = _;
39724           if (svgMapillaryImages.enabled) {
39725               showLayer();
39726           } else {
39727               hideLayer();
39728           }
39729           dispatch.call('change');
39730           return this;
39731       };
39732
39733
39734       drawImages.supported = function() {
39735           return !!getService();
39736       };
39737
39738
39739       init();
39740       return drawImages;
39741   }
39742
39743   function svgMapillarySigns(projection, context, dispatch) {
39744       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
39745       var minZoom = 12;
39746       var layer = select(null);
39747       var _mapillary;
39748
39749
39750       function init() {
39751           if (svgMapillarySigns.initialized) return;  // run once
39752           svgMapillarySigns.enabled = false;
39753           svgMapillarySigns.initialized = true;
39754       }
39755
39756
39757       function getService() {
39758           if (services.mapillary && !_mapillary) {
39759               _mapillary = services.mapillary;
39760               _mapillary.event.on('loadedSigns', throttledRedraw);
39761           } else if (!services.mapillary && _mapillary) {
39762               _mapillary = null;
39763           }
39764           return _mapillary;
39765       }
39766
39767
39768       function showLayer() {
39769           var service = getService();
39770           if (!service) return;
39771
39772           service.loadViewer(context);
39773           editOn();
39774       }
39775
39776
39777       function hideLayer() {
39778           throttledRedraw.cancel();
39779           editOff();
39780       }
39781
39782
39783       function editOn() {
39784           layer.style('display', 'block');
39785       }
39786
39787
39788       function editOff() {
39789           layer.selectAll('.icon-sign').remove();
39790           layer.style('display', 'none');
39791       }
39792
39793
39794       function click(d) {
39795           var service = getService();
39796           if (!service) return;
39797
39798           context.map().centerEase(d.loc);
39799
39800           var selected = service.getSelectedImage();
39801           var selectedImageKey = selected && selected.key;
39802           var imageKey;
39803
39804           // Pick one of the images the sign was detected in,
39805           // preference given to an image already selected.
39806           d.detections.forEach(function(detection) {
39807               if (!imageKey || selectedImageKey === detection.image_key) {
39808                   imageKey = detection.image_key;
39809               }
39810           });
39811
39812           service
39813               .selectImage(null, imageKey)
39814               .updateViewer(imageKey, context)
39815               .showViewer();
39816       }
39817
39818
39819       function update() {
39820           var service = getService();
39821           var data = (service ? service.signs(projection) : []);
39822           var viewer = select('#photoviewer');
39823           var selected = viewer.empty() ? undefined : viewer.datum();
39824           var selectedImageKey = selected && selected.key;
39825           var transform = svgPointTransform(projection);
39826
39827           var signs = layer.selectAll('.icon-sign')
39828               .data(data, function(d) { return d.key; });
39829
39830           // exit
39831           signs.exit()
39832               .remove();
39833
39834           // enter
39835           var enter = signs.enter()
39836               .append('use')
39837               .attr('class', 'icon-sign')
39838               .attr('width', '24px')
39839               .attr('height', '24px')
39840               .attr('x', '-12px')
39841               .attr('y', '-12px')
39842               .attr('xlink:href', function(d) { return '#' + d.value; })
39843               .classed('currentView', function(d) {
39844                   return some(d.detections, function(detection) {
39845                       return detection.image_key === selectedImageKey;
39846                   });
39847               })
39848               .on('click', click);
39849
39850           // update
39851           signs
39852               .merge(enter)
39853               .sort(function(a, b) {
39854                   return (a === selected) ? 1
39855                       : (b === selected) ? -1
39856                       : b.loc[1] - a.loc[1];  // sort Y
39857               })
39858               .attr('transform', transform);
39859       }
39860
39861
39862       function drawSigns(selection) {
39863           var enabled = svgMapillarySigns.enabled;
39864           var service = getService();
39865
39866           layer = selection.selectAll('.layer-mapillary-signs')
39867               .data(service ? [0] : []);
39868
39869           layer.exit()
39870               .remove();
39871
39872           layer = layer.enter()
39873               .append('g')
39874               .attr('class', 'layer-mapillary-signs')
39875               .style('display', enabled ? 'block' : 'none')
39876               .merge(layer);
39877
39878           if (enabled) {
39879               if (service && ~~context.map().zoom() >= minZoom) {
39880                   editOn();
39881                   update();
39882                   service.loadSigns(context, projection);
39883               } else {
39884                   editOff();
39885               }
39886           }
39887       }
39888
39889
39890       drawSigns.enabled = function(_) {
39891           if (!arguments.length) return svgMapillarySigns.enabled;
39892           svgMapillarySigns.enabled = _;
39893           if (svgMapillarySigns.enabled) {
39894               showLayer();
39895           } else {
39896               hideLayer();
39897           }
39898           dispatch.call('change');
39899           return this;
39900       };
39901
39902
39903       drawSigns.supported = function() {
39904           return !!getService();
39905       };
39906
39907
39908       init();
39909       return drawSigns;
39910   }
39911
39912   function svgOpenstreetcamImages(projection, context, dispatch) {
39913       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
39914       var minZoom = 12;
39915       var minMarkerZoom = 16;
39916       var minViewfieldZoom = 18;
39917       var layer = select(null);
39918       var _openstreetcam;
39919
39920
39921       function init() {
39922           if (svgOpenstreetcamImages.initialized) return;  // run once
39923           svgOpenstreetcamImages.enabled = false;
39924           svgOpenstreetcamImages.initialized = true;
39925       }
39926
39927
39928       function getService() {
39929           if (services.openstreetcam && !_openstreetcam) {
39930               _openstreetcam = services.openstreetcam;
39931               _openstreetcam.event.on('loadedImages', throttledRedraw);
39932           } else if (!services.openstreetcam && _openstreetcam) {
39933               _openstreetcam = null;
39934           }
39935
39936           return _openstreetcam;
39937       }
39938
39939
39940       function showLayer() {
39941           var service = getService();
39942           if (!service) return;
39943
39944           service.loadViewer(context);
39945           editOn();
39946
39947           layer
39948               .style('opacity', 0)
39949               .transition()
39950               .duration(250)
39951               .style('opacity', 1)
39952               .on('end', function () { dispatch.call('change'); });
39953       }
39954
39955
39956       function hideLayer() {
39957           throttledRedraw.cancel();
39958
39959           layer
39960               .transition()
39961               .duration(250)
39962               .style('opacity', 0)
39963               .on('end', editOff);
39964       }
39965
39966
39967       function editOn() {
39968           layer.style('display', 'block');
39969       }
39970
39971
39972       function editOff() {
39973           layer.selectAll('.viewfield-group').remove();
39974           layer.style('display', 'none');
39975       }
39976
39977
39978       function click(d) {
39979           var service = getService();
39980           if (!service) return;
39981
39982           service
39983               .selectImage(d)
39984               .updateViewer(d)
39985               .showViewer();
39986
39987           context.map().centerEase(d.loc);
39988       }
39989
39990
39991       function mouseover(d) {
39992           var service = getService();
39993           if (service) service.setStyles(d);
39994       }
39995
39996
39997       function mouseout() {
39998           var service = getService();
39999           if (service) service.setStyles(null);
40000       }
40001
40002
40003       function transform(d) {
40004           var t = svgPointTransform(projection)(d);
40005           if (d.ca) {
40006               t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
40007           }
40008           return t;
40009       }
40010
40011
40012       function update() {
40013           var viewer = select('#photoviewer');
40014           var selected = viewer.empty() ? undefined : viewer.datum();
40015
40016           var z = ~~context.map().zoom();
40017           var showMarkers = (z >= minMarkerZoom);
40018           var showViewfields = (z >= minViewfieldZoom);
40019
40020           var service = getService();
40021           var sequences = (service ? service.sequences(projection) : []);
40022           var images = (service && showMarkers ? service.images(projection) : []);
40023
40024           var traces = layer.selectAll('.sequences').selectAll('.sequence')
40025               .data(sequences, function(d) { return d.properties.key; });
40026
40027           // exit
40028           traces.exit()
40029               .remove();
40030
40031           // enter/update
40032           traces = traces.enter()
40033               .append('path')
40034               .attr('class', 'sequence')
40035               .merge(traces)
40036               .attr('d', svgPath(projection).geojson);
40037
40038
40039           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
40040               .data(images, function(d) { return d.key; });
40041
40042           // exit
40043           groups.exit()
40044               .remove();
40045
40046           // enter
40047           var groupsEnter = groups.enter()
40048               .append('g')
40049               .attr('class', 'viewfield-group')
40050               .on('mouseenter', mouseover)
40051               .on('mouseleave', mouseout)
40052               .on('click', click);
40053
40054           groupsEnter
40055               .append('g')
40056               .attr('class', 'viewfield-scale');
40057
40058           // update
40059           var markers = groups
40060               .merge(groupsEnter)
40061               .sort(function(a, b) {
40062                   return (a === selected) ? 1
40063                       : (b === selected) ? -1
40064                       : b.loc[1] - a.loc[1];  // sort Y
40065               })
40066               .attr('transform', transform)
40067               .select('.viewfield-scale');
40068
40069
40070           markers.selectAll('circle')
40071               .data([0])
40072               .enter()
40073               .append('circle')
40074               .attr('dx', '0')
40075               .attr('dy', '0')
40076               .attr('r', '6');
40077
40078           var viewfields = markers.selectAll('.viewfield')
40079               .data(showViewfields ? [0] : []);
40080
40081           viewfields.exit()
40082               .remove();
40083
40084           viewfields.enter()               // viewfields may or may not be drawn...
40085               .insert('path', 'circle')    // but if they are, draw below the circles
40086               .attr('class', 'viewfield')
40087               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
40088               .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');
40089       }
40090
40091
40092       function drawImages(selection) {
40093           var enabled = svgOpenstreetcamImages.enabled,
40094               service = getService();
40095
40096           layer = selection.selectAll('.layer-openstreetcam-images')
40097               .data(service ? [0] : []);
40098
40099           layer.exit()
40100               .remove();
40101
40102           var layerEnter = layer.enter()
40103               .append('g')
40104               .attr('class', 'layer-openstreetcam-images')
40105               .style('display', enabled ? 'block' : 'none');
40106
40107           layerEnter
40108               .append('g')
40109               .attr('class', 'sequences');
40110
40111           layerEnter
40112               .append('g')
40113               .attr('class', 'markers');
40114
40115           layer = layerEnter
40116               .merge(layer);
40117
40118           if (enabled) {
40119               if (service && ~~context.map().zoom() >= minZoom) {
40120                   editOn();
40121                   update();
40122                   service.loadImages(projection);
40123               } else {
40124                   editOff();
40125               }
40126           }
40127       }
40128
40129
40130       drawImages.enabled = function(_) {
40131           if (!arguments.length) return svgOpenstreetcamImages.enabled;
40132           svgOpenstreetcamImages.enabled = _;
40133           if (svgOpenstreetcamImages.enabled) {
40134               showLayer();
40135           } else {
40136               hideLayer();
40137           }
40138           dispatch.call('change');
40139           return this;
40140       };
40141
40142
40143       drawImages.supported = function() {
40144           return !!getService();
40145       };
40146
40147
40148       init();
40149       return drawImages;
40150   }
40151
40152   function svgOsm(projection, context, dispatch) {
40153       var enabled = true;
40154
40155
40156       function drawOsm(selection) {
40157           selection.selectAll('.layer-osm')
40158               .data(['covered', 'areas', 'lines', 'points', 'labels'])
40159               .enter()
40160               .append('g')
40161               .attr('class', function(d) { return 'layer-osm ' + d; });
40162
40163           selection.selectAll('.layer-osm.points').selectAll('.points-group')
40164               .data(['points', 'midpoints', 'vertices', 'turns'])
40165               .enter()
40166               .append('g')
40167               .attr('class', function(d) { return 'points-group ' + d; });
40168       }
40169
40170
40171       function showLayer() {
40172           var layer = context.surface().selectAll('.data-layer.osm');
40173           layer.interrupt();
40174
40175           layer
40176               .classed('disabled', false)
40177               .style('opacity', 0)
40178               .transition()
40179               .duration(250)
40180               .style('opacity', 1)
40181               .on('end interrupt', function () {
40182                   dispatch.call('change');
40183               });
40184       }
40185
40186
40187       function hideLayer() {
40188           var layer = context.surface().selectAll('.data-layer.osm');
40189           layer.interrupt();
40190
40191           layer
40192               .transition()
40193               .duration(250)
40194               .style('opacity', 0)
40195               .on('end interrupt', function () {
40196                   layer.classed('disabled', true);
40197                   dispatch.call('change');
40198               });
40199       }
40200
40201
40202       drawOsm.enabled = function(_) {
40203           if (!arguments.length) return enabled;
40204           enabled = _;
40205
40206           if (enabled) {
40207               showLayer();
40208           } else {
40209               hideLayer();
40210           }
40211
40212           dispatch.call('change');
40213           return this;
40214       };
40215
40216
40217       return drawOsm;
40218   }
40219
40220   var _notesEnabled = false;
40221   var _osmService;
40222
40223
40224   function svgNotes(projection, context, dispatch$1) {
40225       if (!dispatch$1) { dispatch$1 = dispatch('change'); }
40226       var throttledRedraw = throttle(function () { dispatch$1.call('change'); }, 1000);
40227       var minZoom = 12;
40228       var touchLayer = select(null);
40229       var drawLayer = select(null);
40230       var _notesVisible = false;
40231
40232
40233       function markerPath(selection, klass) {
40234           selection
40235               .attr('class', klass)
40236               .attr('transform', 'translate(-8, -22)')
40237               .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');
40238       }
40239
40240
40241       // Loosely-coupled osm service for fetching notes.
40242       function getService() {
40243           if (services.osm && !_osmService) {
40244               _osmService = services.osm;
40245               _osmService.on('loadedNotes', throttledRedraw);
40246           } else if (!services.osm && _osmService) {
40247               _osmService = null;
40248           }
40249
40250           return _osmService;
40251       }
40252
40253
40254       // Show the notes
40255       function editOn() {
40256           if (!_notesVisible) {
40257               _notesVisible = true;
40258               drawLayer
40259                   .style('display', 'block');
40260           }
40261       }
40262
40263
40264       // Immediately remove the notes and their touch targets
40265       function editOff() {
40266           if (_notesVisible) {
40267               _notesVisible = false;
40268               drawLayer
40269                   .style('display', 'none');
40270               drawLayer.selectAll('.note')
40271                   .remove();
40272               touchLayer.selectAll('.note')
40273                   .remove();
40274           }
40275       }
40276
40277
40278       // Enable the layer.  This shows the notes and transitions them to visible.
40279       function layerOn() {
40280           editOn();
40281
40282           drawLayer
40283               .style('opacity', 0)
40284               .transition()
40285               .duration(250)
40286               .style('opacity', 1)
40287               .on('end interrupt', function () {
40288                   dispatch$1.call('change');
40289               });
40290       }
40291
40292
40293       // Disable the layer.  This transitions the layer invisible and then hides the notes.
40294       function layerOff() {
40295           throttledRedraw.cancel();
40296           drawLayer.interrupt();
40297           touchLayer.selectAll('.note')
40298               .remove();
40299
40300           drawLayer
40301               .transition()
40302               .duration(250)
40303               .style('opacity', 0)
40304               .on('end interrupt', function () {
40305                   editOff();
40306                   dispatch$1.call('change');
40307               });
40308       }
40309
40310
40311       // Update the note markers
40312       function updateMarkers() {
40313           if (!_notesVisible || !_notesEnabled) return;
40314
40315           var service = getService();
40316           var selectedID = context.selectedNoteID();
40317           var data = (service ? service.notes(projection) : []);
40318           var getTransform = svgPointTransform(projection);
40319
40320           // Draw markers..
40321           var notes = drawLayer.selectAll('.note')
40322               .data(data, function(d) { return d.status + d.id; });
40323
40324           // exit
40325           notes.exit()
40326               .remove();
40327
40328           // enter
40329           var notesEnter = notes.enter()
40330               .append('g')
40331               .attr('class', function(d) { return 'note note-' + d.id + ' ' + d.status; })
40332               .classed('new', function(d) { return d.id < 0; });
40333
40334           notesEnter
40335               .append('ellipse')
40336               .attr('cx', 0.5)
40337               .attr('cy', 1)
40338               .attr('rx', 6.5)
40339               .attr('ry', 3)
40340               .attr('class', 'stroke');
40341
40342           notesEnter
40343               .append('path')
40344               .call(markerPath, 'shadow');
40345
40346           notesEnter
40347               .append('use')
40348               .attr('class', 'note-fill')
40349               .attr('width', '20px')
40350               .attr('height', '20px')
40351               .attr('x', '-8px')
40352               .attr('y', '-22px')
40353               .attr('xlink:href', '#iD-icon-note');
40354
40355           notesEnter.selectAll('.icon-annotation')
40356               .data(function(d) { return [d]; })
40357               .enter()
40358               .append('use')
40359               .attr('class', 'icon-annotation')
40360               .attr('width', '10px')
40361               .attr('height', '10px')
40362               .attr('x', '-3px')
40363               .attr('y', '-19px')
40364               .attr('xlink:href', function(d) {
40365                   return '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
40366               });
40367
40368           // update
40369           notes
40370               .merge(notesEnter)
40371               .sort(sortY)
40372               .classed('selected', function(d) {
40373                   var mode = context.mode();
40374                   var isMoving = mode && mode.id === 'drag-note';  // no shadows when dragging
40375                   return !isMoving && d.id === selectedID;
40376               })
40377               .attr('transform', getTransform);
40378
40379
40380           // Draw targets..
40381           if (touchLayer.empty()) return;
40382           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
40383
40384           var targets = touchLayer.selectAll('.note')
40385               .data(data, function(d) { return d.id; });
40386
40387           // exit
40388           targets.exit()
40389               .remove();
40390
40391           // enter/update
40392           targets.enter()
40393               .append('rect')
40394               .attr('width', '20px')
40395               .attr('height', '20px')
40396               .attr('x', '-8px')
40397               .attr('y', '-22px')
40398               .merge(targets)
40399               .sort(sortY)
40400               .attr('class', function(d) {
40401                   var newClass = (d.id < 0 ? 'new' : '');
40402                   return 'note target note-' + d.id + ' ' + fillClass + newClass;
40403               })
40404               .attr('transform', getTransform);
40405
40406
40407           function sortY(a, b) {
40408               return (a.id === selectedID) ? 1 : (b.id === selectedID) ? -1 : b.loc[1] - a.loc[1];
40409           }
40410       }
40411
40412
40413       // Draw the notes layer and schedule loading notes and updating markers.
40414       function drawNotes(selection) {
40415           var service = getService();
40416
40417           var surface = context.surface();
40418           if (surface && !surface.empty()) {
40419               touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
40420           }
40421
40422           drawLayer = selection.selectAll('.layer-notes')
40423               .data(service ? [0] : []);
40424
40425           drawLayer.exit()
40426               .remove();
40427
40428           drawLayer = drawLayer.enter()
40429               .append('g')
40430               .attr('class', 'layer-notes')
40431               .style('display', _notesEnabled ? 'block' : 'none')
40432               .merge(drawLayer);
40433
40434           if (_notesEnabled) {
40435               if (service && ~~context.map().zoom() >= minZoom) {
40436                   editOn();
40437                   service.loadNotes(projection);
40438                   updateMarkers();
40439               } else {
40440                   editOff();
40441               }
40442           }
40443       }
40444
40445
40446       // Toggles the layer on and off
40447       drawNotes.enabled = function(val) {
40448           if (!arguments.length) return _notesEnabled;
40449
40450           _notesEnabled = val;
40451           if (_notesEnabled) {
40452               layerOn();
40453           } else {
40454               layerOff();
40455               if (context.selectedNoteID()) {
40456                   context.enter(modeBrowse(context));
40457               }
40458           }
40459
40460           dispatch$1.call('change');
40461           return this;
40462       };
40463
40464
40465       return drawNotes;
40466   }
40467
40468   function svgTouch() {
40469
40470       function drawTouch(selection) {
40471           selection.selectAll('.layer-touch')
40472               .data(['areas', 'lines', 'points', 'turns', 'markers'])
40473               .enter()
40474               .append('g')
40475               .attr('class', function(d) { return 'layer-touch ' + d; });
40476       }
40477
40478       return drawTouch;
40479   }
40480
40481   function svgLayers(projection, context) {
40482       var dispatch$1 = dispatch('change');
40483       var svg = select(null);
40484       var layers = [
40485           { id: 'osm', layer: svgOsm(projection, context, dispatch$1) },
40486           { id: 'notes', layer: svgNotes(projection, context, dispatch$1) },
40487           { id: 'data', layer: svgData(projection, context, dispatch$1) },
40488           { id: 'keepRight', layer: svgKeepRight(projection, context, dispatch$1) },
40489           { id: 'improveOSM', layer: svgImproveOSM(projection, context, dispatch$1) },
40490           { id: 'streetside', layer: svgStreetside(projection, context, dispatch$1)},
40491           { id: 'mapillary-images', layer: svgMapillaryImages(projection, context, dispatch$1) },
40492           { id: 'mapillary-signs',  layer: svgMapillarySigns(projection, context, dispatch$1) },
40493           { id: 'openstreetcam-images', layer: svgOpenstreetcamImages(projection, context, dispatch$1) },
40494           { id: 'debug', layer: svgDebug(projection, context, dispatch$1) },
40495           { id: 'geolocate', layer: svgGeolocate(projection, context, dispatch$1) },
40496           { id: 'touch', layer: svgTouch(projection, context, dispatch$1) }
40497       ];
40498
40499
40500       function drawLayers(selection) {
40501           svg = selection.selectAll('.surface')
40502               .data([0]);
40503
40504           svg = svg.enter()
40505               .append('svg')
40506               .attr('class', 'surface')
40507               .merge(svg);
40508
40509           var defs = svg.selectAll('.surface-defs')
40510               .data([0]);
40511
40512           defs.enter()
40513               .append('defs')
40514               .attr('class', 'surface-defs');
40515
40516           var groups = svg.selectAll('.data-layer')
40517               .data(layers);
40518
40519           groups.exit()
40520               .remove();
40521
40522           groups.enter()
40523               .append('g')
40524               .attr('class', function(d) { return 'data-layer ' + d.id; })
40525               .merge(groups)
40526               .each(function(d) { select(this).call(d.layer); });
40527       }
40528
40529
40530       drawLayers.all = function() {
40531           return layers;
40532       };
40533
40534
40535       drawLayers.layer = function(id) {
40536           var obj = find$1(layers, function(o) {return o.id === id;});
40537           return obj && obj.layer;
40538       };
40539
40540
40541       drawLayers.only = function(what) {
40542           var arr = [].concat(what);
40543           drawLayers.remove(difference(map$3(layers, 'id'), arr));
40544           return this;
40545       };
40546
40547
40548       drawLayers.remove = function(what) {
40549           var arr = [].concat(what);
40550           arr.forEach(function(id) {
40551               layers = reject(layers, function(o) {return o.id === id;});
40552           });
40553           dispatch$1.call('change');
40554           return this;
40555       };
40556
40557
40558       drawLayers.add = function(what) {
40559           var arr = [].concat(what);
40560           arr.forEach(function(obj) {
40561               if ('id' in obj && 'layer' in obj) {
40562                   layers.push(obj);
40563               }
40564           });
40565           dispatch$1.call('change');
40566           return this;
40567       };
40568
40569
40570       drawLayers.dimensions = function(_) {
40571           if (!arguments.length) return utilGetDimensions(svg);
40572           utilSetDimensions(svg, _);
40573           return this;
40574       };
40575
40576
40577       return utilRebind(drawLayers, dispatch$1, 'on');
40578   }
40579
40580   function svgLines(projection, context) {
40581       var detected = utilDetect();
40582
40583       var highway_stack = {
40584           motorway: 0,
40585           motorway_link: 1,
40586           trunk: 2,
40587           trunk_link: 3,
40588           primary: 4,
40589           primary_link: 5,
40590           secondary: 6,
40591           tertiary: 7,
40592           unclassified: 8,
40593           residential: 9,
40594           service: 10,
40595           footway: 11
40596       };
40597
40598
40599       function drawTargets(selection, graph, entities, filter) {
40600           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
40601           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
40602           var getPath = svgPath(projection).geojson;
40603           var activeID = context.activeID();
40604
40605           // The targets and nopes will be MultiLineString sub-segments of the ways
40606           var data = { targets: [], nopes: [] };
40607
40608           entities.forEach(function(way) {
40609               var features = svgSegmentWay(way, graph, activeID);
40610               data.targets.push.apply(data.targets, features.passive);
40611               data.nopes.push.apply(data.nopes, features.active);
40612           });
40613
40614
40615           // Targets allow hover and vertex snapping
40616           var targetData = data.targets.filter(getPath);
40617           var targets = selection.selectAll('.line.target-allowed')
40618               .filter(function(d) { return filter(d.properties.entity); })
40619               .data(targetData, function key(d) { return d.id; });
40620
40621           // exit
40622           targets.exit()
40623               .remove();
40624
40625           // enter/update
40626           targets.enter()
40627               .append('path')
40628               .merge(targets)
40629               .attr('d', getPath)
40630               .attr('class', function(d) { return 'way line target target-allowed ' + targetClass + d.id; });
40631
40632
40633           // NOPE
40634           var nopeData = data.nopes.filter(getPath);
40635           var nopes = selection.selectAll('.line.target-nope')
40636               .filter(function(d) { return filter(d.properties.entity); })
40637               .data(nopeData, function key(d) { return d.id; });
40638
40639           // exit
40640           nopes.exit()
40641               .remove();
40642
40643           // enter/update
40644           nopes.enter()
40645               .append('path')
40646               .merge(nopes)
40647               .attr('d', getPath)
40648               .attr('class', function(d) { return 'way line target target-nope ' + nopeClass + d.id; });
40649       }
40650
40651
40652       function drawLines(selection, graph, entities, filter$1) {
40653
40654           function waystack(a, b) {
40655               var selected = context.selectedIDs();
40656               var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
40657               var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
40658
40659               if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
40660               if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
40661               return scoreA - scoreB;
40662           }
40663
40664
40665           function drawLineGroup(selection, klass, isSelected) {
40666               // Note: Don't add `.selected` class in draw modes
40667               var mode = context.mode();
40668               var isDrawing = mode && /^draw/.test(mode.id);
40669               var selectedClass = (!isDrawing && isSelected) ? 'selected ' : '';
40670
40671               var lines = selection
40672                   .selectAll('path')
40673                   .filter(filter$1)
40674                   .data(getPathData(isSelected), osmEntity.key);
40675
40676               lines.exit()
40677                   .remove();
40678
40679               // Optimization: Call expensive TagClasses only on enter selection. This
40680               // works because osmEntity.key is defined to include the entity v attribute.
40681               lines.enter()
40682                   .append('path')
40683                   .attr('class', function(d) {
40684                       var oldMPClass = oldMultiPolygonOuters[d.id] ? 'old-multipolygon ' : '';
40685                       return 'way line ' + klass + ' ' + selectedClass + oldMPClass + d.id;
40686                   })
40687                   .call(svgTagClasses())
40688                   .merge(lines)
40689                   .sort(waystack)
40690                   .attr('d', getPath)
40691                   .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
40692
40693               return selection;
40694           }
40695
40696
40697           function getPathData(isSelected) {
40698               return function() {
40699                   var layer = this.parentNode.__data__;
40700                   var data = pathdata[layer] || [];
40701                   return data.filter(function(d) {
40702                       if (isSelected)
40703                           return context.selectedIDs().indexOf(d.id) !== -1;
40704                       else
40705                           return context.selectedIDs().indexOf(d.id) === -1;
40706                   });
40707               };
40708           }
40709
40710           function addMarkers(layergroup, pathclass, groupclass, groupdata, marker) {
40711               var markergroup = layergroup
40712                   .selectAll('g.' + groupclass)
40713                   .data([pathclass]);
40714
40715               markergroup = markergroup.enter()
40716                   .append('g')
40717                   .attr('class', groupclass)
40718                   .merge(markergroup);
40719
40720               var markers = markergroup
40721                   .selectAll('path')
40722                   .filter(filter$1)
40723                   .data(
40724                       function data() { return groupdata[this.parentNode.__data__] || []; },
40725                       function key(d) { return [d.id, d.index]; }
40726                   );
40727
40728               markers.exit()
40729                   .remove();
40730
40731               markers = markers.enter()
40732                   .append('path')
40733                   .attr('class', pathclass)
40734                   .attr('marker-mid', marker)
40735                   .merge(markers)
40736                   .attr('d', function(d) { return d.d; });
40737
40738               if (detected.ie) {
40739                   markers.each(function() { this.parentNode.insertBefore(this, this); });
40740               }
40741           }
40742
40743
40744           var getPath = svgPath(projection, graph);
40745           var ways = [];
40746           var pathdata = {};
40747           var onewaydata = {};
40748           var sideddata = {};
40749           var oldMultiPolygonOuters = {};
40750
40751           for (var i = 0; i < entities.length; i++) {
40752               var entity = entities[i];
40753               var outer = osmOldMultipolygonOuterMember(entity, graph);
40754               if (outer) {
40755                   ways.push(entity.mergeTags(outer.tags));
40756                   oldMultiPolygonOuters[outer.id] = true;
40757               } else if (entity.geometry(graph) === 'line') {
40758                   ways.push(entity);
40759               }
40760           }
40761
40762           ways = ways.filter(getPath);
40763           pathdata = groupBy(ways, function(way) { return way.layer(); });
40764
40765           forOwn(pathdata, function(v, k) {
40766               var onewayArr = filter(v, function(d) { return d.isOneWay(); });
40767               var onewaySegments = svgMarkerSegments(
40768                   projection, graph, 35,
40769                   function shouldReverse(entity) { return entity.tags.oneway === '-1'; },
40770                   function bothDirections(entity) {
40771                       return entity.tags.oneway === 'reversible' || entity.tags.oneway === 'alternating';
40772                   }
40773               );
40774               onewaydata[k] = flatten(map$3(onewayArr, onewaySegments));
40775
40776               var sidedArr = filter(v, function(d) { return d.isSided(); });
40777               var sidedSegments = svgMarkerSegments(
40778                   projection, graph, 30,
40779                   function shouldReverse() { return false; },
40780                   function bothDirections() { return false; }
40781               );
40782               sideddata[k] = flatten(map$3(sidedArr, sidedSegments));
40783           });
40784
40785
40786           var covered = selection.selectAll('.layer-osm.covered');     // under areas
40787           var uncovered = selection.selectAll('.layer-osm.lines');     // over areas
40788           var touchLayer = selection.selectAll('.layer-touch.lines');
40789
40790           // Draw lines..
40791           [covered, uncovered].forEach(function(selection) {
40792               var range$1 = (selection === covered ? range(-10,0) : range(0,11));
40793               var layergroup = selection
40794                   .selectAll('g.layergroup')
40795                   .data(range$1);
40796
40797               layergroup = layergroup.enter()
40798                   .append('g')
40799                   .attr('class', function(d) { return 'layergroup layer' + String(d); })
40800                   .merge(layergroup);
40801
40802               layergroup
40803                   .selectAll('g.linegroup')
40804                   .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
40805                   .enter()
40806                   .append('g')
40807                   .attr('class', function(d) { return 'linegroup line-' + d; });
40808
40809               layergroup.selectAll('g.line-shadow')
40810                   .call(drawLineGroup, 'shadow', false);
40811               layergroup.selectAll('g.line-casing')
40812                   .call(drawLineGroup, 'casing', false);
40813               layergroup.selectAll('g.line-stroke')
40814                   .call(drawLineGroup, 'stroke', false);
40815
40816               layergroup.selectAll('g.line-shadow-highlighted')
40817                   .call(drawLineGroup, 'shadow', true);
40818               layergroup.selectAll('g.line-casing-highlighted')
40819                   .call(drawLineGroup, 'casing', true);
40820               layergroup.selectAll('g.line-stroke-highlighted')
40821                   .call(drawLineGroup, 'stroke', true);
40822
40823               addMarkers(layergroup, 'oneway', 'onewaygroup', onewaydata, 'url(#oneway-marker)');
40824               addMarkers(layergroup, 'sided', 'sidedgroup', sideddata,
40825                   function marker(d) {
40826                       var category = graph.entity(d.id).sidednessIdentifier();
40827                       return 'url(#sided-marker-' + category + ')';
40828                   }
40829               );
40830           });
40831
40832           // Draw touch targets..
40833           touchLayer
40834               .call(drawTargets, graph, ways, filter$1);
40835       }
40836
40837
40838       return drawLines;
40839   }
40840
40841   function svgMidpoints(projection, context) {
40842       var targetRadius = 8;
40843
40844       function drawTargets(selection, graph, entities, filter) {
40845           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
40846           var getTransform = svgPointTransform(projection).geojson;
40847
40848           var data = entities.map(function(midpoint) {
40849               return {
40850                   type: 'Feature',
40851                   id: midpoint.id,
40852                   properties: {
40853                       target: true,
40854                       entity: midpoint
40855                   },
40856                   geometry: {
40857                       type: 'Point',
40858                       coordinates: midpoint.loc
40859                   }
40860               };
40861           });
40862
40863           var targets = selection.selectAll('.midpoint.target')
40864               .filter(function(d) { return filter(d.properties.entity); })
40865               .data(data, function key(d) { return d.id; });
40866
40867           // exit
40868           targets.exit()
40869               .remove();
40870
40871           // enter/update
40872           targets.enter()
40873               .append('circle')
40874               .attr('r', targetRadius)
40875               .merge(targets)
40876               .attr('class', function(d) { return 'node midpoint target ' + fillClass + d.id; })
40877               .attr('transform', getTransform);
40878       }
40879
40880
40881       function drawMidpoints(selection, graph, entities, filter, extent) {
40882           var drawLayer = selection.selectAll('.layer-osm.points .points-group.midpoints');
40883           var touchLayer = selection.selectAll('.layer-touch.points');
40884
40885           var mode = context.mode();
40886           if (mode && mode.id !== 'select') {
40887               drawLayer.selectAll('.midpoint').remove();
40888               touchLayer.selectAll('.midpoint.target').remove();
40889               return;
40890           }
40891
40892           var poly = extent.polygon();
40893           var midpoints = {};
40894
40895           for (var i = 0; i < entities.length; i++) {
40896               var entity = entities[i];
40897
40898               if (entity.type !== 'way') continue;
40899               if (!filter(entity)) continue;
40900               if (context.selectedIDs().indexOf(entity.id) < 0) continue;
40901
40902               var nodes = graph.childNodes(entity);
40903               for (var j = 0; j < nodes.length - 1; j++) {
40904                   var a = nodes[j];
40905                   var b = nodes[j + 1];
40906                   var id = [a.id, b.id].sort().join('-');
40907
40908                   if (midpoints[id]) {
40909                       midpoints[id].parents.push(entity);
40910                   } else if (geoVecLength(projection(a.loc), projection(b.loc)) > 40) {
40911                       var point = geoVecInterp(a.loc, b.loc, 0.5);
40912                       var loc = null;
40913
40914                       if (extent.intersects(point)) {
40915                           loc = point;
40916                       } else {
40917                           for (var k = 0; k < 4; k++) {
40918                               point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
40919                               if (point &&
40920                                   geoVecLength(projection(a.loc), projection(point)) > 20 &&
40921                                   geoVecLength(projection(b.loc), projection(point)) > 20)
40922                               {
40923                                   loc = point;
40924                                   break;
40925                               }
40926                           }
40927                       }
40928
40929                       if (loc) {
40930                           midpoints[id] = {
40931                               type: 'midpoint',
40932                               id: id,
40933                               loc: loc,
40934                               edge: [a.id, b.id],
40935                               parents: [entity]
40936                           };
40937                       }
40938                   }
40939               }
40940           }
40941
40942
40943           function midpointFilter(d) {
40944               if (midpoints[d.id])
40945                   return true;
40946
40947               for (var i = 0; i < d.parents.length; i++) {
40948                   if (filter(d.parents[i])) {
40949                       return true;
40950                   }
40951               }
40952
40953               return false;
40954           }
40955
40956
40957           var groups = drawLayer.selectAll('.midpoint')
40958               .filter(midpointFilter)
40959               .data(values$1(midpoints), function(d) { return d.id; });
40960
40961           groups.exit()
40962               .remove();
40963
40964           var enter = groups.enter()
40965               .insert('g', ':first-child')
40966               .attr('class', 'midpoint');
40967
40968           enter
40969               .append('polygon')
40970               .attr('points', '-6,8 10,0 -6,-8')
40971               .attr('class', 'shadow');
40972
40973           enter
40974               .append('polygon')
40975               .attr('points', '-3,4 5,0 -3,-4')
40976               .attr('class', 'fill');
40977
40978           groups = groups
40979               .merge(enter)
40980               .attr('transform', function(d) {
40981                   var translate = svgPointTransform(projection);
40982                   var a = graph.entity(d.edge[0]);
40983                   var b = graph.entity(d.edge[1]);
40984                   var angle = geoAngle(a, b, projection) * (180 / Math.PI);
40985                   return translate(d) + ' rotate(' + angle + ')';
40986               })
40987               .call(svgTagClasses().tags(
40988                   function(d) { return d.parents[0].tags; }
40989               ));
40990
40991           // Propagate data bindings.
40992           groups.select('polygon.shadow');
40993           groups.select('polygon.fill');
40994
40995
40996           // Draw touch targets..
40997           touchLayer
40998               .call(drawTargets, graph, values$1(midpoints), midpointFilter);
40999       }
41000
41001       return drawMidpoints;
41002   }
41003
41004   function svgPoints(projection, context) {
41005
41006       function markerPath(selection, klass) {
41007           selection
41008               .attr('class', klass)
41009               .attr('transform', 'translate(-8, -23)')
41010               .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');
41011       }
41012
41013       function sortY(a, b) {
41014           return b.loc[1] - a.loc[1];
41015       }
41016
41017
41018       // Avoid exit/enter if we're just moving stuff around.
41019       // The node will get a new version but we only need to run the update selection.
41020       function fastEntityKey(d) {
41021           var mode = context.mode();
41022           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
41023           return isMoving ? d.id : osmEntity.key(d);
41024       }
41025
41026
41027       function drawTargets(selection, graph, entities, filter) {
41028           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
41029           var getTransform = svgPointTransform(projection).geojson;
41030           var activeID = context.activeID();
41031           var data = [];
41032
41033           entities.forEach(function(node) {
41034               if (activeID === node.id) return;   // draw no target on the activeID
41035
41036               data.push({
41037                   type: 'Feature',
41038                   id: node.id,
41039                   properties: {
41040                       target: true,
41041                       entity: node
41042                   },
41043                   geometry: node.asGeoJSON()
41044               });
41045           });
41046
41047           var targets = selection.selectAll('.point.target')
41048               .filter(function(d) { return filter(d.properties.entity); })
41049               .data(data, function key(d) { return d.id; });
41050
41051           // exit
41052           targets.exit()
41053               .remove();
41054
41055           // enter/update
41056           targets.enter()
41057               .append('rect')
41058               .attr('x', -10)
41059               .attr('y', -26)
41060               .attr('width', 20)
41061               .attr('height', 30)
41062               .merge(targets)
41063               .attr('class', function(d) { return 'node point target ' + fillClass + d.id; })
41064               .attr('transform', getTransform);
41065       }
41066
41067
41068       function drawPoints(selection, graph, entities, filter) {
41069           var wireframe = context.surface().classed('fill-wireframe');
41070           var zoom = geoScaleToZoom(projection.scale());
41071
41072           // Points with a direction will render as vertices at higher zooms..
41073           function renderAsPoint(entity) {
41074               return entity.geometry(graph) === 'point' &&
41075                   !(zoom >= 18 && entity.directions(graph, projection).length);
41076           }
41077
41078           // All points will render as vertices in wireframe mode too..
41079           var points = wireframe ? [] : entities.filter(renderAsPoint);
41080           points.sort(sortY);
41081
41082
41083           var drawLayer = selection.selectAll('.layer-osm.points .points-group.points');
41084           var touchLayer = selection.selectAll('.layer-touch.points');
41085
41086           // Draw points..
41087           var groups = drawLayer.selectAll('g.point')
41088               .filter(filter)
41089               .data(points, fastEntityKey);
41090
41091           groups.exit()
41092               .remove();
41093
41094           var enter = groups.enter()
41095               .append('g')
41096               .attr('class', function(d) { return 'node point ' + d.id; })
41097               .order();
41098
41099           enter
41100               .append('path')
41101               .call(markerPath, 'shadow');
41102
41103           enter
41104               .append('ellipse')
41105               .attr('cx', 0.5)
41106               .attr('cy', 1)
41107               .attr('rx', 6.5)
41108               .attr('ry', 3)
41109               .attr('class', 'stroke');
41110
41111           enter
41112               .append('path')
41113               .call(markerPath, 'stroke');
41114
41115           enter
41116               .append('use')
41117               .attr('transform', 'translate(-5, -19)')
41118               .attr('class', 'icon')
41119               .attr('width', '11px')
41120               .attr('height', '11px');
41121
41122           groups = groups
41123               .merge(enter)
41124               .attr('transform', svgPointTransform(projection))
41125               .call(svgTagClasses());
41126
41127           // Selecting the following implicitly
41128           // sets the data (point entity) on the element
41129           groups.select('.shadow');
41130           groups.select('.stroke');
41131           groups.select('.icon')
41132               .attr('xlink:href', function(entity) {
41133                   var preset = context.presets().match(entity, graph);
41134                   var picon = preset && preset.icon;
41135
41136                   if (!picon) {
41137                       return '';
41138                   } else {
41139                       var isMaki = /^maki-/.test(picon);
41140                       return '#' + picon + (isMaki ? '-11' : '');
41141                   }
41142               });
41143
41144
41145           // Draw touch targets..
41146           touchLayer
41147               .call(drawTargets, graph, points, filter);
41148       }
41149
41150
41151       return drawPoints;
41152   }
41153
41154   function svgTagClasses() {
41155       var primaries = [
41156           'building', 'highway', 'railway', 'waterway', 'aeroway', 'aerialway',
41157           'piste:type', 'boundary', 'power', 'amenity', 'natural', 'landuse',
41158           'leisure', 'military', 'place', 'man_made', 'route', 'attraction'
41159       ];
41160       var statuses = [
41161           'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
41162           'razed', 'demolished', 'obliterated', 'intermittent'
41163       ];
41164       var secondaries = [
41165           'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
41166           'surface', 'tracktype', 'footway', 'crossing', 'service', 'sport',
41167           'public_transport', 'location', 'parking', 'golf', 'type'
41168       ];
41169       var _tags = function(entity) { return entity.tags; };
41170
41171
41172       var tagClasses = function(selection) {
41173           selection.each(function tagClassesEach(entity) {
41174               var value = this.className;
41175
41176               if (value.baseVal !== undefined) {
41177                   value = value.baseVal;
41178               }
41179
41180               var t = _tags(entity);
41181
41182               var computed = tagClasses.getClassesString(t, value, entity);
41183
41184               if (computed !== value) {
41185                   select(this).attr('class', computed);
41186               }
41187           });
41188       };
41189
41190
41191       tagClasses.getClassesString = function(t, value, entity) {
41192           var primary, status;
41193           var i, k, v;
41194
41195           // in some situations we want to render perimeter strokes a certain way
41196           var overrideGeometry;
41197           if (/\bstroke\b/.test(value)) {
41198               if (!!t.barrier && t.barrier !== 'no') {
41199                   overrideGeometry = 'line';
41200               } else if (t.type === 'multipolygon' && !entity.hasInterestingTags()) {
41201                   overrideGeometry = 'area';
41202               }
41203           }
41204
41205           // preserve base classes (nothing with `tag-`)
41206           var classes = value.trim().split(/\s+/)
41207               .filter(function(klass) {
41208                   return klass.length && !/^tag-/.test(klass);
41209               })
41210               .map(function(klass) {  // special overrides for some perimeter strokes
41211                   return (klass === 'line' || klass === 'area') ? (overrideGeometry || klass) : klass;
41212               });
41213
41214           // pick at most one primary classification tag..
41215           for (i = 0; i < primaries.length; i++) {
41216               k = primaries[i];
41217               v = t[k];
41218               if (!v || v === 'no') continue;
41219
41220               if (k === 'piste:type') {  // avoid a ':' in the class name
41221                   k = 'piste';
41222               }
41223
41224               primary = k;
41225               if (statuses.indexOf(v) !== -1) {   // e.g. `railway=abandoned`
41226                   status = v;
41227                   classes.push('tag-' + k);
41228               } else {
41229                   classes.push('tag-' + k);
41230                   classes.push('tag-' + k + '-' + v);
41231               }
41232
41233               break;
41234           }
41235
41236           // add at most one status tag, only if relates to primary tag..
41237           if (!status) {
41238               for (i = 0; i < statuses.length; i++) {
41239                   k = statuses[i];
41240                   v = t[k];
41241                   if (!v || v === 'no') continue;
41242
41243                   if (v === 'yes') {   // e.g. `railway=rail + abandoned=yes`
41244                       status = k;
41245                   }
41246                   else if (primary && primary === v) {  // e.g. `railway=rail + abandoned=railway`
41247                       status = k;
41248                   } else if (!primary && primaries.indexOf(v) !== -1) {  // e.g. `abandoned=railway`
41249                       status = k;
41250                       primary = v;
41251                       classes.push('tag-' + v);
41252                   }  // else ignore e.g.  `highway=path + abandoned=railway`
41253
41254                   if (status) break;
41255               }
41256           }
41257
41258           if (status) {
41259               classes.push('tag-status');
41260               classes.push('tag-status-' + status);
41261           }
41262
41263           // add any secondary tags
41264           for (i = 0; i < secondaries.length; i++) {
41265               k = secondaries[i];
41266               v = t[k];
41267               if (!v || v === 'no') continue;
41268               classes.push('tag-' + k);
41269               classes.push('tag-' + k + '-' + v);
41270           }
41271
41272           // For highways, look for surface tagging..
41273           if (primary === 'highway' || primary === 'aeroway') {
41274               var paved = (t.highway !== 'track');
41275               for (k in t) {
41276                   v = t[k];
41277                   if (k in osmPavedTags) {
41278                       paved = !!osmPavedTags[k][v];
41279                       break;
41280                   }
41281               }
41282               if (!paved) {
41283                   classes.push('tag-unpaved');
41284               }
41285           }
41286
41287           return classes.join(' ').trim();
41288       };
41289
41290
41291       tagClasses.tags = function(val) {
41292           if (!arguments.length) return _tags;
41293           _tags = val;
41294           return tagClasses;
41295       };
41296
41297       return tagClasses;
41298   }
41299
41300   function svgTurns(projection, context) {
41301
41302       function icon(turn) {
41303           var u = turn.u ? '-u' : '';
41304           if (turn.no) return '#iD-turn-no' + u;
41305           if (turn.only) return '#iD-turn-only' + u;
41306           return '#iD-turn-yes' + u;
41307       }
41308
41309       function drawTurns(selection, graph, turns) {
41310
41311           function turnTransform(d) {
41312               var pxRadius = 50;
41313               var toWay = graph.entity(d.to.way);
41314               var toPoints = graph.childNodes(toWay)
41315                   .map(function (n) { return n.loc; })
41316                   .map(projection);
41317               var toLength = geoPathLength(toPoints);
41318               var mid = toLength / 2;    // midpoint of destination way
41319
41320               var toNode = graph.entity(d.to.node);
41321               var toVertex = graph.entity(d.to.vertex);
41322               var a = geoAngle(toVertex, toNode, projection);
41323               var o = projection(toVertex.loc);
41324               var r = d.u ? 0                  // u-turn: no radius
41325                   : !toWay.__via ? pxRadius    // leaf way: put marker at pxRadius
41326                   : Math.min(mid, pxRadius);   // via way: prefer pxRadius, fallback to mid for very short ways
41327
41328               return 'translate(' + (r * Math.cos(a) + o[0]) + ',' + (r * Math.sin(a) + o[1]) + ') ' +
41329                   'rotate(' + a * 180 / Math.PI + ')';
41330           }
41331
41332
41333           var drawLayer = selection.selectAll('.layer-osm.points .points-group.turns');
41334           var touchLayer = selection.selectAll('.layer-touch.turns');
41335
41336           // Draw turns..
41337           var groups = drawLayer.selectAll('g.turn')
41338               .data(turns, function(d) { return d.key; });
41339
41340           // exit
41341           groups.exit()
41342               .remove();
41343
41344           // enter
41345           var groupsEnter = groups.enter()
41346               .append('g')
41347               .attr('class', function(d) { return 'turn ' + d.key; });
41348
41349           var turnsEnter = groupsEnter
41350               .filter(function(d) { return !d.u; });
41351
41352           turnsEnter.append('rect')
41353               .attr('transform', 'translate(-22, -12)')
41354               .attr('width', '44')
41355               .attr('height', '24');
41356
41357           turnsEnter.append('use')
41358               .attr('transform', 'translate(-22, -12)')
41359               .attr('width', '44')
41360               .attr('height', '24');
41361
41362           var uEnter = groupsEnter
41363               .filter(function(d) { return d.u; });
41364
41365           uEnter.append('circle')
41366               .attr('r', '16');
41367
41368           uEnter.append('use')
41369               .attr('transform', 'translate(-16, -16)')
41370               .attr('width', '32')
41371               .attr('height', '32');
41372
41373           // update
41374           groups = groups
41375               .merge(groupsEnter)
41376               .attr('opacity', function(d) { return d.direct === false ? '0.7' : null; })
41377               .attr('transform', turnTransform);
41378
41379           groups.select('use')
41380               .attr('xlink:href', icon);
41381
41382           groups.select('rect');      // propagate bound data
41383           groups.select('circle');    // propagate bound data
41384
41385
41386           // Draw touch targets..
41387           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
41388           groups = touchLayer.selectAll('g.turn')
41389               .data(turns, function(d) { return d.key; });
41390
41391           // exit
41392           groups.exit()
41393               .remove();
41394
41395           // enter
41396           groupsEnter = groups.enter()
41397               .append('g')
41398               .attr('class', function(d) { return 'turn ' + d.key; });
41399
41400           turnsEnter = groupsEnter
41401               .filter(function(d) { return !d.u; });
41402
41403           turnsEnter.append('rect')
41404               .attr('class', 'target ' + fillClass)
41405               .attr('transform', 'translate(-22, -12)')
41406               .attr('width', '44')
41407               .attr('height', '24');
41408
41409           uEnter = groupsEnter
41410               .filter(function(d) { return d.u; });
41411
41412           uEnter.append('circle')
41413               .attr('class', 'target ' + fillClass)
41414               .attr('r', '16');
41415
41416           // update
41417           groups = groups
41418               .merge(groupsEnter)
41419               .attr('transform', turnTransform);
41420
41421           groups.select('rect');      // propagate bound data
41422           groups.select('circle');    // propagate bound data
41423
41424
41425           return this;
41426       }
41427
41428       return drawTurns;
41429   }
41430
41431   function svgVertices(projection, context) {
41432       var radiuses = {
41433           //       z16-, z17,   z18+,  w/icon
41434           shadow: [6,    7.5,   7.5,   12],
41435           stroke: [2.5,  3.5,   3.5,   8],
41436           fill:   [1,    1.5,   1.5,   1.5]
41437       };
41438
41439       var _currHoverTarget;
41440       var _currPersistent = {};
41441       var _currHover = {};
41442       var _prevHover = {};
41443       var _currSelected = {};
41444       var _prevSelected = {};
41445       var _radii = {};
41446
41447
41448       function sortY(a, b) {
41449           return b.loc[1] - a.loc[1];
41450       }
41451
41452       // Avoid exit/enter if we're just moving stuff around.
41453       // The node will get a new version but we only need to run the update selection.
41454       function fastEntityKey(d) {
41455           var mode = context.mode();
41456           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
41457           return isMoving ? d.id : osmEntity.key(d);
41458       }
41459
41460
41461       function draw(selection, graph, vertices, sets, filter) {
41462           sets = sets || { selected: {}, important: {}, hovered: {} };
41463
41464           var icons = {};
41465           var directions = {};
41466           var wireframe = context.surface().classed('fill-wireframe');
41467           var zoom = geoScaleToZoom(projection.scale());
41468           var z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
41469           var activeID = context.activeID();
41470
41471
41472           function getIcon(d) {
41473               // always check latest entity, as fastEntityKey avoids enter/exit now
41474               var entity = graph.entity(d.id);
41475               if (entity.id in icons) return icons[entity.id];
41476
41477               icons[entity.id] =
41478                   entity.hasInterestingTags() &&
41479                   context.presets().match(entity, graph).icon;
41480
41481               return icons[entity.id];
41482           }
41483
41484
41485           // memoize directions results, return false for empty arrays (for use in filter)
41486           function getDirections(entity) {
41487               if (entity.id in directions) return directions[entity.id];
41488
41489               var angles = entity.directions(graph, projection);
41490               directions[entity.id] = angles.length ? angles : false;
41491               return angles;
41492           }
41493
41494
41495           function updateAttributes(selection) {
41496               ['shadow', 'stroke', 'fill'].forEach(function(klass) {
41497                   var rads = radiuses[klass];
41498                   selection.selectAll('.' + klass)
41499                       .each(function(entity) {
41500                           var i = z && getIcon(entity);
41501                           var r = rads[i ? 3 : z];
41502
41503                           // slightly increase the size of unconnected endpoints #3775
41504                           if (entity.id !== activeID && entity.isEndpoint(graph) && !entity.isConnected(graph)) {
41505                               r += 1.5;
41506                           }
41507
41508                           if (klass === 'shadow') {   // remember this value, so we don't need to
41509                               _radii[entity.id] = r;  // recompute it when we draw the touch targets
41510                           }
41511
41512                           select(this)
41513                               .attr('r', r)
41514                               .attr('visibility', (i && klass === 'fill') ? 'hidden' : null);
41515                       });
41516               });
41517           }
41518
41519           vertices.sort(sortY);
41520
41521           var groups = selection.selectAll('g.vertex')
41522               .filter(filter)
41523               .data(vertices, fastEntityKey);
41524
41525           // exit
41526           groups.exit()
41527               .remove();
41528
41529           // enter
41530           var enter = groups.enter()
41531               .append('g')
41532               .attr('class', function(d) { return 'node vertex ' + d.id; })
41533               .order();
41534
41535           enter
41536               .append('circle')
41537               .attr('class', 'shadow');
41538
41539           enter
41540               .append('circle')
41541               .attr('class', 'stroke');
41542
41543           // Vertices with tags get a fill.
41544           enter.filter(function(d) { return d.hasInterestingTags(); })
41545               .append('circle')
41546               .attr('class', 'fill');
41547
41548           // update
41549           groups = groups
41550               .merge(enter)
41551               .attr('transform', svgPointTransform(projection))
41552               .classed('sibling', function(d) { return d.id in sets.selected; })
41553               .classed('shared', function(d) { return graph.isShared(d); })
41554               .classed('endpoint', function(d) { return d.isEndpoint(graph); })
41555               .call(updateAttributes);
41556
41557
41558           // Vertices with icons get a `use`.
41559           var iconUse = groups
41560               .selectAll('.icon')
41561               .data(function data(d) { return zoom >= 17 && getIcon(d) ? [d] : []; }, fastEntityKey);
41562
41563           // exit
41564           iconUse.exit()
41565               .remove();
41566
41567           // enter
41568           iconUse.enter()
41569               .append('use')
41570               .attr('class', 'icon')
41571               .attr('width', '11px')
41572               .attr('height', '11px')
41573               .attr('transform', 'translate(-5.5, -5.5)')
41574               .attr('xlink:href', function(d) {
41575                   var picon = getIcon(d);
41576                   var isMaki = /^maki-/.test(picon);
41577                   return '#' + picon + (isMaki ? '-11' : '');
41578               });
41579
41580
41581           // Vertices with directions get viewfields
41582           var dgroups = groups
41583               .selectAll('.viewfieldgroup')
41584               .data(function data(d) { return zoom >= 18 && getDirections(d) ? [d] : []; }, fastEntityKey);
41585
41586           // exit
41587           dgroups.exit()
41588               .remove();
41589
41590           // enter/update
41591           dgroups = dgroups.enter()
41592               .insert('g', '.shadow')
41593               .attr('class', 'viewfieldgroup')
41594               .merge(dgroups);
41595
41596           var viewfields = dgroups.selectAll('.viewfield')
41597               .data(getDirections, function key(d) { return osmEntity.key(d); });
41598
41599           // exit
41600           viewfields.exit()
41601               .remove();
41602
41603           // enter/update
41604           viewfields.enter()
41605               .append('path')
41606               .attr('class', 'viewfield')
41607               .attr('d', 'M0,0H0')
41608               .merge(viewfields)
41609               .attr('marker-start', 'url(#viewfield-marker' + (wireframe ? '-wireframe' : '') + ')')
41610               .attr('transform', function(d) { return 'rotate(' + d + ')'; });
41611       }
41612
41613
41614       function drawTargets(selection, graph, entities, filter) {
41615           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
41616           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
41617           var getTransform = svgPointTransform(projection).geojson;
41618           var activeID = context.activeID();
41619           var data = { targets: [], nopes: [] };
41620
41621           entities.forEach(function(node) {
41622               if (activeID === node.id) return;   // draw no target on the activeID
41623
41624               var vertexType = svgPassiveVertex(node, graph, activeID);
41625               if (vertexType !== 0) {     // passive or adjacent - allow to connect
41626                   data.targets.push({
41627                       type: 'Feature',
41628                       id: node.id,
41629                       properties: {
41630                           target: true,
41631                           entity: node
41632                       },
41633                       geometry: node.asGeoJSON()
41634                   });
41635               } else {
41636                   data.nopes.push({
41637                       type: 'Feature',
41638                       id: node.id + '-nope',
41639                       properties: {
41640                           nope: true,
41641                           target: true,
41642                           entity: node
41643                       },
41644                       geometry: node.asGeoJSON()
41645                   });
41646               }
41647           });
41648
41649
41650           // Targets allow hover and vertex snapping
41651           var targets = selection.selectAll('.vertex.target-allowed')
41652               .filter(function(d) { return filter(d.properties.entity); })
41653               .data(data.targets, function key(d) { return d.id; });
41654
41655           // exit
41656           targets.exit()
41657               .remove();
41658
41659           // enter/update
41660           targets.enter()
41661               .append('circle')
41662               .attr('r', function(d) { return (_radii[d.id] || radiuses.shadow[3]); })
41663               .merge(targets)
41664               .attr('class', function(d) { return 'node vertex target target-allowed ' + targetClass + d.id; })
41665               .attr('transform', getTransform);
41666
41667
41668           // NOPE
41669           var nopes = selection.selectAll('.vertex.target-nope')
41670               .filter(function(d) { return filter(d.properties.entity); })
41671               .data(data.nopes, function key(d) { return d.id; });
41672
41673           // exit
41674           nopes.exit()
41675               .remove();
41676
41677           // enter/update
41678           nopes.enter()
41679               .append('circle')
41680               .attr('r', function(d) { return (_radii[d.properties.entity.id] || radiuses.shadow[3]); })
41681               .merge(nopes)
41682               .attr('class', function(d) { return 'node vertex target target-nope ' + nopeClass + d.id; })
41683               .attr('transform', getTransform);
41684       }
41685
41686
41687       // Points can also render as vertices:
41688       // 1. in wireframe mode or
41689       // 2. at higher zooms if they have a direction
41690       function renderAsVertex(entity, graph, wireframe, zoom) {
41691           var geometry = entity.geometry(graph);
41692           return geometry === 'vertex' || (geometry === 'point' && (
41693               wireframe || (zoom >= 18 && entity.directions(graph, projection).length)
41694           ));
41695       }
41696
41697
41698       function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
41699           var results = {};
41700
41701           function addChildVertices(entity) {
41702               var geometry = entity.geometry(graph);
41703               if (!context.features().isHiddenFeature(entity, graph, geometry)) {
41704                   var i;
41705                   if (entity.type === 'way') {
41706                       for (i = 0; i < entity.nodes.length; i++) {
41707                           var child = graph.hasEntity(entity.nodes[i]);
41708                           if (child) {
41709                               addChildVertices(child);
41710                           }
41711                       }
41712                   } else if (entity.type === 'relation') {
41713                       for (i = 0; i < entity.members.length; i++) {
41714                           var member = graph.hasEntity(entity.members[i].id);
41715                           if (member) {
41716                               addChildVertices(member);
41717                           }
41718                       }
41719                   } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
41720                       results[entity.id] = entity;
41721                   }
41722               }
41723           }
41724
41725           ids.forEach(function(id) {
41726               var entity = graph.hasEntity(id);
41727               if (!entity) return;
41728
41729               if (entity.type === 'node') {
41730                   if (renderAsVertex(entity, graph, wireframe, zoom)) {
41731                       results[entity.id] = entity;
41732                       graph.parentWays(entity).forEach(function(entity) {
41733                           addChildVertices(entity);
41734                       });
41735                   }
41736               } else {  // way, relation
41737                   addChildVertices(entity);
41738               }
41739           });
41740
41741           return results;
41742       }
41743
41744
41745       function drawVertices(selection, graph, entities, filter, extent, fullRedraw) {
41746           var wireframe = context.surface().classed('fill-wireframe');
41747           var zoom = geoScaleToZoom(projection.scale());
41748           var mode = context.mode();
41749           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
41750
41751           var drawLayer = selection.selectAll('.layer-osm.points .points-group.vertices');
41752           var touchLayer = selection.selectAll('.layer-touch.points');
41753
41754           if (fullRedraw) {
41755               _currPersistent = {};
41756               _radii = {};
41757           }
41758
41759           // Collect important vertices from the `entities` list..
41760           // (during a paritial redraw, it will not contain everything)
41761           for (var i = 0; i < entities.length; i++) {
41762               var entity = entities[i];
41763               var geometry = entity.geometry(graph);
41764               var keep = false;
41765
41766               // a point that looks like a vertex..
41767               if ((geometry === 'point') && renderAsVertex(entity, graph, wireframe, zoom)) {
41768                   _currPersistent[entity.id] = entity;
41769                   keep = true;
41770
41771               // a vertex of some importance..
41772               } else if (geometry === 'vertex' &&
41773                   (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph))) {
41774                   _currPersistent[entity.id] = entity;
41775                   keep = true;
41776               }
41777
41778               // whatever this is, it's not a persistent vertex..
41779               if (!keep && !fullRedraw) {
41780                   delete _currPersistent[entity.id];
41781               }
41782           }
41783
41784           // 3 sets of vertices to consider:
41785           var sets = {
41786               persistent: _currPersistent,  // persistent = important vertices (render always)
41787               selected: _currSelected,      // selected + siblings of selected (render always)
41788               hovered: _currHover           // hovered + siblings of hovered (render only in draw modes)
41789           };
41790
41791           var all = assign({}, (isMoving ? _currHover : {}), _currSelected, _currPersistent);
41792
41793           // Draw the vertices..
41794           // The filter function controls the scope of what objects d3 will touch (exit/enter/update)
41795           // Adjust the filter function to expand the scope beyond whatever entities were passed in.
41796           var filterRendered = function(d) {
41797               return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter(d);
41798           };
41799           drawLayer
41800               .call(draw, graph, currentVisible(all), sets, filterRendered);
41801
41802           // Draw touch targets..
41803           // When drawing, render all targets (not just those affected by a partial redraw)
41804           var filterTouch = function(d) {
41805               return isMoving ? true : filterRendered(d);
41806           };
41807           touchLayer
41808               .call(drawTargets, graph, currentVisible(all), filterTouch);
41809
41810
41811           function currentVisible(which) {
41812               return Object.keys(which)
41813                   .map(graph.hasEntity, graph)     // the current version of this entity
41814                   .filter(function (entity) { return entity && entity.intersects(extent, graph); });
41815           }
41816       }
41817
41818
41819       // partial redraw - only update the selected items..
41820       drawVertices.drawSelected = function(selection, graph, extent) {
41821           var wireframe = context.surface().classed('fill-wireframe');
41822           var zoom = geoScaleToZoom(projection.scale());
41823
41824           _prevSelected = _currSelected || {};
41825           _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
41826
41827           // note that drawVertices will add `_currSelected` automatically if needed..
41828           var filter = function(d) { return d.id in _prevSelected; };
41829           drawVertices(selection, graph, values$1(_prevSelected), filter, extent, false);
41830       };
41831
41832
41833       // partial redraw - only update the hovered items..
41834       drawVertices.drawHover = function(selection, graph, target, extent) {
41835           if (target === _currHoverTarget) return;  // continue only if something changed
41836
41837           var wireframe = context.surface().classed('fill-wireframe');
41838           var zoom = geoScaleToZoom(projection.scale());
41839
41840           _prevHover = _currHover || {};
41841           _currHoverTarget = target;
41842           var entity = target && target.properties && target.properties.entity;
41843
41844           if (entity) {
41845               _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
41846           } else {
41847               _currHover = {};
41848           }
41849
41850           // note that drawVertices will add `_currHover` automatically if needed..
41851           var filter = function(d) { return d.id in _prevHover; };
41852           drawVertices(selection, graph, values$1(_prevHover), filter, extent, false);
41853       };
41854
41855       return drawVertices;
41856   }
41857
41858   /* global Mapillary:false */
41859
41860
41861   var apibase = 'https://a.mapillary.com/v3/';
41862   var viewercss = 'mapillary-js/mapillary.min.css';
41863   var viewerjs = 'mapillary-js/mapillary.min.js';
41864   var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi';
41865   var maxResults = 1000;
41866   var tileZoom = 14;
41867   var tiler$2 = utilTiler().zoomExtent([tileZoom, tileZoom]).skipNullIsland(true);
41868   var dispatch$3 = dispatch('loadedImages', 'loadedSigns', 'bearingChanged');
41869   var _mlyFallback = false;
41870   var _mlyCache;
41871   var _mlyClicks;
41872   var _mlySelectedImage;
41873   var _mlyViewer;
41874
41875
41876   function abortRequest$2(i) {
41877       i.abort();
41878   }
41879
41880
41881   function maxPageAtZoom(z) {
41882       if (z < 15)   return 2;
41883       if (z === 15) return 5;
41884       if (z === 16) return 10;
41885       if (z === 17) return 20;
41886       if (z === 18) return 40;
41887       if (z > 18)   return 80;
41888   }
41889
41890
41891   function loadTiles(which, url, projection) {
41892       var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
41893       var tiles = tiler$2.getTiles(projection);
41894
41895       // abort inflight requests that are no longer needed
41896       var cache = _mlyCache[which];
41897       forEach(cache.inflight, function(v, k) {
41898           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
41899
41900           if (!wanted) {
41901               abortRequest$2(v);
41902               delete cache.inflight[k];
41903           }
41904       });
41905
41906       tiles.forEach(function(tile) {
41907           loadNextTilePage(which, currZoom, url, tile);
41908       });
41909   }
41910
41911
41912   function loadNextTilePage(which, currZoom, url, tile) {
41913       var cache = _mlyCache[which];
41914       var rect = tile.extent.rectangle();
41915       var maxPages = maxPageAtZoom(currZoom);
41916       var nextPage = cache.nextPage[tile.id] || 0;
41917       var nextURL = cache.nextURL[tile.id] || url +
41918           utilQsString({
41919               per_page: maxResults,
41920               page: nextPage,
41921               client_id: clientId,
41922               bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
41923           });
41924
41925       if (nextPage > maxPages) return;
41926
41927       var id = tile.id + ',' + String(nextPage);
41928       if (cache.loaded[id] || cache.inflight[id]) return;
41929       cache.inflight[id] = request(nextURL)
41930           .mimeType('application/json')
41931           .response(function(xhr) {
41932               var linkHeader = xhr.getResponseHeader('Link');
41933               if (linkHeader) {
41934                   var pagination = parsePagination(xhr.getResponseHeader('Link'));
41935                   if (pagination.next) {
41936                       cache.nextURL[tile.id] = pagination.next;
41937                   }
41938               }
41939               return JSON.parse(xhr.responseText);
41940           })
41941           .get(function(err, data) {
41942               cache.loaded[id] = true;
41943               delete cache.inflight[id];
41944               if (err || !data.features || !data.features.length) return;
41945
41946               var features = data.features.map(function(feature) {
41947                   var loc = feature.geometry.coordinates;
41948                   var d;
41949
41950                   // An image (shown as a green dot on the map) is a single street photo with extra
41951                   // information such as location, camera angle (CA), camera model, and so on.
41952                   // Each image feature is a GeoJSON Point
41953                   if (which === 'images') {
41954                       d = {
41955                           loc: loc,
41956                           key: feature.properties.key,
41957                           ca: feature.properties.ca,
41958                           captured_at: feature.properties.captured_at,
41959                           captured_by: feature.properties.username,
41960                           pano: feature.properties.pano
41961                       };
41962
41963                       cache.forImageKey[d.key] = d;     // cache imageKey -> image
41964
41965                   // Mapillary organizes images as sequences. A sequence of images are continuously captured
41966                   // by a user at a give time. Sequences are shown on the map as green lines.
41967                   // Each sequence feature is a GeoJSON LineString
41968                   } else if (which === 'sequences') {
41969                       var sequenceKey = feature.properties.key;
41970                       cache.lineString[sequenceKey] = feature;           // cache sequenceKey -> lineString
41971                       feature.properties.coordinateProperties.image_keys.forEach(function(imageKey) {
41972                           cache.forImageKey[imageKey] = sequenceKey;     // cache imageKey -> sequenceKey
41973                       });
41974                       return false;    // because no `d` data worth loading into an rbush
41975
41976                   // An image detection is a semantic pixel area on an image. The area could indicate
41977                   // sky, trees, sidewalk in the image. A detection can be a polygon, a bounding box, or a point.
41978                   // Each image_detection feature is a GeoJSON Point (located where the image was taken)
41979                   } else if (which === 'image_detections') {
41980                       d = {
41981                           key: feature.properties.key,
41982                           image_key: feature.properties.image_key,
41983                           value: feature.properties.value,
41984                           package: feature.properties.package,
41985                           shape: feature.properties.shape
41986                       };
41987
41988                       // cache imageKey -> image_detections
41989                       if (!cache.forImageKey[d.image_key]) {
41990                           cache.forImageKey[d.image_key] = [];
41991                       }
41992                       cache.forImageKey[d.image_key].push(d);
41993                       return false;    // because no `d` data worth loading into an rbush
41994
41995
41996                   // A map feature is a real world object that can be shown on a map. It could be any object
41997                   // recognized from images, manually added in images, or added on the map.
41998                   // Each map feature is a GeoJSON Point (located where the feature is)
41999                   } else if (which === 'map_features') {
42000                       d = {
42001                           loc: loc,
42002                           key: feature.properties.key,
42003                           value: feature.properties.value,
42004                           package: feature.properties.package,
42005                           detections: feature.properties.detections
42006                       };
42007                   }
42008
42009                   return {
42010                       minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
42011                   };
42012
42013               }).filter(Boolean);
42014
42015               if (cache.rtree && features) {
42016                   cache.rtree.load(features);
42017               }
42018
42019               if (which === 'images' || which === 'sequences') {
42020                   dispatch$3.call('loadedImages');
42021               } else if (which === 'map_features') {
42022                   dispatch$3.call('loadedSigns');
42023               }
42024
42025               if (data.features.length === maxResults) {  // more pages to load
42026                   cache.nextPage[tile.id] = nextPage + 1;
42027                   loadNextTilePage(which, currZoom, url, tile);
42028               } else {
42029                   cache.nextPage[tile.id] = Infinity;     // no more pages to load
42030               }
42031           });
42032   }
42033
42034   // extract links to pages of API results
42035   function parsePagination(links) {
42036       return links.split(',').map(function(rel) {
42037           var elements = rel.split(';');
42038           if (elements.length === 2) {
42039               return [
42040                   /<(.+)>/.exec(elements[0])[1],
42041                   /rel="(.+)"/.exec(elements[1])[1]
42042               ];
42043           } else {
42044               return ['',''];
42045           }
42046       }).reduce(function(pagination, val) {
42047           pagination[val[1]] = val[0];
42048           return pagination;
42049       }, {});
42050   }
42051
42052
42053   // partition viewport into higher zoom tiles
42054   function partitionViewport(projection) {
42055       var z = geoScaleToZoom(projection.scale());
42056       var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
42057       var tiler = utilTiler().zoomExtent([z2, z2]);
42058
42059       return tiler.getTiles(projection)
42060           .map(function(tile) { return tile.extent; });
42061   }
42062
42063
42064   // no more than `limit` results per partition.
42065   function searchLimited(limit, projection, rtree) {
42066       limit = limit || 5;
42067
42068       return partitionViewport(projection)
42069           .reduce(function(result, extent) {
42070               var found = rtree.search(extent.bbox())
42071                   .slice(0, limit)
42072                   .map(function(d) { return d.data; });
42073
42074               return (found.length ? result.concat(found) : result);
42075           }, []);
42076   }
42077
42078
42079
42080   var serviceMapillary = {
42081
42082       init: function() {
42083           if (!_mlyCache) {
42084               this.reset();
42085           }
42086
42087           this.event = utilRebind(this, dispatch$3, 'on');
42088       },
42089
42090       reset: function() {
42091           var cache = _mlyCache;
42092
42093           if (cache) {
42094               if (cache.images && cache.images.inflight) {
42095                   forEach(cache.images.inflight, abortRequest$2);
42096               }
42097               if (cache.image_detections && cache.image_detections.inflight) {
42098                   forEach(cache.image_detections.inflight, abortRequest$2);
42099               }
42100               if (cache.map_features && cache.map_features.inflight) {
42101                   forEach(cache.map_features.inflight, abortRequest$2);
42102               }
42103               if (cache.sequences && cache.sequences.inflight) {
42104                   forEach(cache.sequences.inflight, abortRequest$2);
42105               }
42106           }
42107
42108           _mlyCache = {
42109               images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {} },
42110               image_detections: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, forImageKey: {} },
42111               map_features: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
42112               sequences: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {}, lineString: {} }
42113           };
42114
42115           _mlySelectedImage = null;
42116           _mlyClicks = [];
42117       },
42118
42119
42120       images: function(projection) {
42121           var limit = 5;
42122           return searchLimited(limit, projection, _mlyCache.images.rtree);
42123       },
42124
42125
42126       signs: function(projection) {
42127           var limit = 5;
42128           return searchLimited(limit, projection, _mlyCache.map_features.rtree);
42129       },
42130
42131
42132       sequences: function(projection) {
42133           var viewport = projection.clipExtent();
42134           var min = [viewport[0][0], viewport[1][1]];
42135           var max = [viewport[1][0], viewport[0][1]];
42136           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
42137           var sequenceKeys = {};
42138
42139           // all sequences for images in viewport
42140           _mlyCache.images.rtree.search(bbox)
42141               .forEach(function(d) {
42142                   var sequenceKey = _mlyCache.sequences.forImageKey[d.data.key];
42143                   if (sequenceKey) {
42144                       sequenceKeys[sequenceKey] = true;
42145                   }
42146               });
42147
42148           // Return lineStrings for the sequences
42149           return Object.keys(sequenceKeys).map(function(sequenceKey) {
42150               return _mlyCache.sequences.lineString[sequenceKey];
42151           });
42152       },
42153
42154
42155       signsSupported: function() {
42156           return true;
42157       },
42158
42159
42160       loadImages: function(projection) {
42161           loadTiles('images', apibase + 'images?', projection);
42162           loadTiles('sequences', apibase + 'sequences?', projection);
42163       },
42164
42165
42166       loadSigns: function(context, projection) {
42167           // if we are looking at signs, we'll actually need to fetch images too
42168           loadTiles('images', apibase + 'images?', projection);
42169           loadTiles('map_features', apibase + 'map_features?layers=trafficsigns&min_nbr_image_detections=1&', projection);
42170           loadTiles('image_detections', apibase + 'image_detections?layers=trafficsigns&', projection);
42171       },
42172
42173
42174       loadViewer: function(context) {
42175           // add mly-wrapper
42176           var wrap = select('#photoviewer').selectAll('.mly-wrapper')
42177               .data([0]);
42178
42179           wrap.enter()
42180               .append('div')
42181               .attr('id', 'mly')
42182               .attr('class', 'photo-wrapper mly-wrapper')
42183               .classed('hide', true);
42184
42185           // load mapillary-viewercss
42186           select('head').selectAll('#mapillary-viewercss')
42187               .data([0])
42188               .enter()
42189               .append('link')
42190               .attr('id', 'mapillary-viewercss')
42191               .attr('rel', 'stylesheet')
42192               .attr('href', context.asset(viewercss));
42193
42194           // load mapillary-viewerjs
42195           select('head').selectAll('#mapillary-viewerjs')
42196               .data([0])
42197               .enter()
42198               .append('script')
42199               .attr('id', 'mapillary-viewerjs')
42200               .attr('src', context.asset(viewerjs));
42201
42202           // load mapillary signs sprite
42203           var defs = context.container().select('defs');
42204           defs.call(svgDefs(context).addSprites, ['mapillary-sprite'], false /* don't override colors */ );
42205
42206           // Register viewer resize handler
42207           context.ui().photoviewer.on('resize', function() {
42208               if (_mlyViewer) {
42209                   _mlyViewer.resize();
42210               }
42211           });
42212       },
42213
42214
42215       showViewer: function() {
42216           var wrap = select('#photoviewer')
42217               .classed('hide', false);
42218
42219           var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size();
42220
42221           if (isHidden && _mlyViewer) {
42222               wrap
42223                   .selectAll('.photo-wrapper:not(.mly-wrapper)')
42224                   .classed('hide', true);
42225
42226               wrap
42227                   .selectAll('.photo-wrapper.mly-wrapper')
42228                   .classed('hide', false);
42229
42230               _mlyViewer.resize();
42231           }
42232
42233           return this;
42234       },
42235
42236
42237       hideViewer: function() {
42238           _mlySelectedImage = null;
42239
42240           if (!_mlyFallback && _mlyViewer) {
42241               _mlyViewer.getComponent('sequence').stop();
42242           }
42243
42244           var viewer = select('#photoviewer');
42245           if (!viewer.empty()) viewer.datum(null);
42246
42247           viewer
42248               .classed('hide', true)
42249               .selectAll('.photo-wrapper')
42250               .classed('hide', true);
42251
42252           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
42253               .classed('currentView', false);
42254
42255           return this.setStyles(null, true);
42256       },
42257
42258
42259       parsePagination: parsePagination,
42260
42261
42262       updateViewer: function(imageKey, context) {
42263           if (!imageKey) return this;
42264
42265           if (!_mlyViewer) {
42266               this.initViewer(imageKey, context);
42267           } else {
42268               _mlyViewer.moveToKey(imageKey)
42269                   .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
42270           }
42271
42272           return this;
42273       },
42274
42275
42276       initViewer: function(imageKey, context) {
42277           var that = this;
42278           if (window.Mapillary && imageKey) {
42279               var opts = {
42280                   baseImageSize: 320,
42281                   component: {
42282                       cover: false,
42283                       keyboard: false,
42284                       tag: true
42285                   }
42286               };
42287
42288               // Disable components requiring WebGL support
42289               if (!Mapillary.isSupported() && Mapillary.isFallbackSupported()) {
42290                   _mlyFallback = true;
42291                   opts.component = {
42292                       cover: false,
42293                       direction: false,
42294                       imagePlane: false,
42295                       keyboard: false,
42296                       mouse: false,
42297                       sequence: false,
42298                       tag: false,
42299                       image: true,        // fallback
42300                       navigation: true    // fallback
42301                   };
42302               }
42303
42304               _mlyViewer = new Mapillary.Viewer('mly', clientId, null, opts);
42305               _mlyViewer.on('nodechanged', nodeChanged);
42306               _mlyViewer.on('bearingchanged', bearingChanged);
42307               _mlyViewer.moveToKey(imageKey)
42308                   .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
42309           }
42310
42311           // nodeChanged: called after the viewer has changed images and is ready.
42312           //
42313           // There is some logic here to batch up clicks into a _mlyClicks array
42314           // because the user might click on a lot of markers quickly and nodechanged
42315           // may be called out of order asychronously.
42316           //
42317           // Clicks are added to the array in `selectedImage` and removed here.
42318           //
42319           function nodeChanged(node) {
42320               if (!_mlyFallback) {
42321                   _mlyViewer.getComponent('tag').removeAll();  // remove previous detections
42322               }
42323
42324               var clicks = _mlyClicks;
42325               var index = clicks.indexOf(node.key);
42326               var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
42327
42328               if (index > -1) {              // `nodechanged` initiated from clicking on a marker..
42329                   clicks.splice(index, 1);   // remove the click
42330                   // If `node.key` matches the current _mlySelectedImage, call `selectImage()`
42331                   // one more time to update the detections and attribution..
42332                   if (node.key === selectedKey) {
42333                       that.selectImage(_mlySelectedImage, node.key, true);
42334                   }
42335               } else {             // `nodechanged` initiated from the Mapillary viewer controls..
42336                   var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat];
42337                   context.map().centerEase(loc);
42338                   that.selectImage(undefined, node.key, true);
42339               }
42340           }
42341
42342           function bearingChanged(e) {
42343               dispatch$3.call('bearingChanged', undefined, e);
42344           }
42345       },
42346
42347
42348       // Pass the image datum itself in `d` or the `imageKey` string.
42349       // This allows images to be selected from places that dont have access
42350       // to the full image datum (like the street signs layer or the js viewer)
42351       selectImage: function(d, imageKey, fromViewer) {
42352           if (!d && imageKey) {
42353               // If the user clicked on something that's not an image marker, we
42354               // might get in here.. Cache lookup can fail, e.g. if the user
42355               // clicked a streetsign, but images are loading slowly asynchronously.
42356               // We'll try to carry on anyway if there is no datum.  There just
42357               // might be a delay before user sees detections, captured_at, etc.
42358               d = _mlyCache.images.forImageKey[imageKey];
42359           }
42360
42361           _mlySelectedImage = d;
42362           var viewer = select('#photoviewer');
42363           if (!viewer.empty()) viewer.datum(d);
42364
42365           imageKey = (d && d.key) || imageKey;
42366           if (!fromViewer && imageKey) {
42367               _mlyClicks.push(imageKey);
42368           }
42369
42370           this.setStyles(null, true);
42371
42372           // if signs signs are shown, highlight the ones that appear in this image
42373           d3_selectAll('.layer-mapillary-signs .icon-sign')
42374               .classed('currentView', function(d) {
42375                   return some(d.detections, function(detection) {
42376                       return detection.image_key === imageKey;
42377                   });
42378               });
42379
42380           if (d) {
42381               this.updateDetections(d);
42382           }
42383
42384           return this;
42385       },
42386
42387
42388       getSelectedImage: function() {
42389           return _mlySelectedImage;
42390       },
42391
42392
42393       getSequenceKeyForImage: function(d) {
42394           var imageKey = d && d.key;
42395           return imageKey && _mlyCache.sequences.forImageKey[imageKey];
42396       },
42397
42398
42399       // Updates the currently highlighted sequence and selected bubble.
42400       // Reset is only necessary when interacting with the viewport because
42401       // this implicitly changes the currently selected bubble/sequence
42402       setStyles: function(hovered, reset) {
42403           if (reset) {  // reset all layers
42404               d3_selectAll('.viewfield-group')
42405                   .classed('highlighted', false)
42406                   .classed('hovered', false)
42407                   .classed('currentView', false);
42408
42409               d3_selectAll('.sequence')
42410                   .classed('highlighted', false)
42411                   .classed('currentView', false);
42412           }
42413
42414           var hoveredImageKey = hovered && hovered.key;
42415           var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
42416           var hoveredLineString = hoveredSequenceKey && _mlyCache.sequences.lineString[hoveredSequenceKey];
42417           var hoveredImageKeys = (hoveredLineString && hoveredLineString.properties.coordinateProperties.image_keys) || [];
42418
42419           var viewer = select('#photoviewer');
42420           var selected = viewer.empty() ? undefined : viewer.datum();
42421           var selectedImageKey = selected && selected.key;
42422           var selectedSequenceKey = this.getSequenceKeyForImage(selected);
42423           var selectedLineString = selectedSequenceKey && _mlyCache.sequences.lineString[selectedSequenceKey];
42424           var selectedImageKeys = (selectedLineString && selectedLineString.properties.coordinateProperties.image_keys) || [];
42425
42426           // highlight sibling viewfields on either the selected or the hovered sequences
42427           var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
42428
42429           d3_selectAll('.layer-mapillary-images .viewfield-group')
42430               .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
42431               .classed('hovered', function(d) { return d.key === hoveredImageKey; })
42432               .classed('currentView', function(d) { return d.key === selectedImageKey; });
42433
42434           d3_selectAll('.layer-mapillary-images .sequence')
42435               .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
42436               .classed('currentView', function(d) { return d.properties.key === selectedSequenceKey; });
42437
42438           // update viewfields if needed
42439           d3_selectAll('.viewfield-group .viewfield')
42440               .attr('d', viewfieldPath);
42441
42442           function viewfieldPath() {
42443               var d = this.parentNode.__data__;
42444               if (d.pano && d.key !== selectedImageKey) {
42445                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
42446               } else {
42447                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
42448               }
42449           }
42450
42451           return this;
42452       },
42453
42454
42455       updateDetections: function(d) {
42456           if (!_mlyViewer || _mlyFallback) return;
42457
42458           var imageKey = d && d.key;
42459           if (!imageKey) return;
42460
42461           var detections = _mlyCache.image_detections.forImageKey[imageKey] || [];
42462           detections.forEach(function(data) {
42463               var tag = makeTag(data);
42464               if (tag) {
42465                   var tagComponent = _mlyViewer.getComponent('tag');
42466                   tagComponent.add([tag]);
42467               }
42468           });
42469
42470           function makeTag(data) {
42471               var valueParts = data.value.split('--');
42472               if (valueParts.length !== 3) return;
42473
42474               var text = valueParts[1].replace(/-/g, ' ');
42475               var tag;
42476
42477               // Currently only two shapes <Polygon|Point>
42478               if (data.shape.type === 'Polygon') {
42479                   var polygonGeometry = new Mapillary
42480                       .TagComponent
42481                       .PolygonGeometry(data.shape.coordinates[0]);
42482
42483                   tag = new Mapillary.TagComponent.OutlineTag(
42484                       data.key,
42485                       polygonGeometry,
42486                       {
42487                           text: text,
42488                           textColor: 0xffff00,
42489                           lineColor: 0xffff00,
42490                           lineWidth: 2,
42491                           fillColor: 0xffff00,
42492                           fillOpacity: 0.3,
42493                       }
42494                   );
42495
42496               } else if (data.shape.type === 'Point') {
42497                   var pointGeometry = new Mapillary
42498                       .TagComponent
42499                       .PointGeometry(data.shape.coordinates[0]);
42500
42501                   tag = new Mapillary.TagComponent.SpotTag(
42502                       data.key,
42503                       pointGeometry,
42504                       {
42505                           text: text,
42506                           color: 0xffff00,
42507                           textColor: 0xffff00
42508                       }
42509                   );
42510               }
42511
42512               return tag;
42513           }
42514       },
42515
42516
42517       cache: function() {
42518           return _mlyCache;
42519       }
42520
42521   };
42522
42523   /**
42524    * Performs a partial deep comparison between `object` and `source` to
42525    * determine if `object` contains equivalent property values.
42526    *
42527    * **Note:** This method is equivalent to `_.matches` when `source` is
42528    * partially applied.
42529    *
42530    * Partial comparisons will match empty array and empty object `source`
42531    * values against any array or object value, respectively. See `_.isEqual`
42532    * for a list of supported value comparisons.
42533    *
42534    * @static
42535    * @memberOf _
42536    * @since 3.0.0
42537    * @category Lang
42538    * @param {Object} object The object to inspect.
42539    * @param {Object} source The object of property values to match.
42540    * @returns {boolean} Returns `true` if `object` is a match, else `false`.
42541    * @example
42542    *
42543    * var object = { 'a': 1, 'b': 2 };
42544    *
42545    * _.isMatch(object, { 'b': 2 });
42546    * // => true
42547    *
42548    * _.isMatch(object, { 'b': 1 });
42549    * // => false
42550    */
42551   function isMatch(object, source) {
42552     return object === source || baseIsMatch(object, source, getMatchData(source));
42553   }
42554
42555   /* Built-in method references for those with the same name as other `lodash` methods. */
42556   var nativeMin$1 = Math.min;
42557
42558   /**
42559    * The base implementation of methods like `_.intersection`, without support
42560    * for iteratee shorthands, that accepts an array of arrays to inspect.
42561    *
42562    * @private
42563    * @param {Array} arrays The arrays to inspect.
42564    * @param {Function} [iteratee] The iteratee invoked per element.
42565    * @param {Function} [comparator] The comparator invoked per element.
42566    * @returns {Array} Returns the new array of shared values.
42567    */
42568   function baseIntersection(arrays, iteratee, comparator) {
42569     var includes = comparator ? arrayIncludesWith : arrayIncludes,
42570         length = arrays[0].length,
42571         othLength = arrays.length,
42572         othIndex = othLength,
42573         caches = Array(othLength),
42574         maxLength = Infinity,
42575         result = [];
42576
42577     while (othIndex--) {
42578       var array = arrays[othIndex];
42579       if (othIndex && iteratee) {
42580         array = arrayMap(array, baseUnary(iteratee));
42581       }
42582       maxLength = nativeMin$1(array.length, maxLength);
42583       caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
42584         ? new SetCache(othIndex && array)
42585         : undefined;
42586     }
42587     array = arrays[0];
42588
42589     var index = -1,
42590         seen = caches[0];
42591
42592     outer:
42593     while (++index < length && result.length < maxLength) {
42594       var value = array[index],
42595           computed = iteratee ? iteratee(value) : value;
42596
42597       value = (comparator || value !== 0) ? value : 0;
42598       if (!(seen
42599             ? cacheHas(seen, computed)
42600             : includes(result, computed, comparator)
42601           )) {
42602         othIndex = othLength;
42603         while (--othIndex) {
42604           var cache = caches[othIndex];
42605           if (!(cache
42606                 ? cacheHas(cache, computed)
42607                 : includes(arrays[othIndex], computed, comparator))
42608               ) {
42609             continue outer;
42610           }
42611         }
42612         if (seen) {
42613           seen.push(computed);
42614         }
42615         result.push(value);
42616       }
42617     }
42618     return result;
42619   }
42620
42621   /**
42622    * Casts `value` to an empty array if it's not an array like object.
42623    *
42624    * @private
42625    * @param {*} value The value to inspect.
42626    * @returns {Array|Object} Returns the cast array-like object.
42627    */
42628   function castArrayLikeObject(value) {
42629     return isArrayLikeObject(value) ? value : [];
42630   }
42631
42632   /**
42633    * Creates an array of unique values that are included in all given arrays
42634    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
42635    * for equality comparisons. The order and references of result values are
42636    * determined by the first array.
42637    *
42638    * @static
42639    * @memberOf _
42640    * @since 0.1.0
42641    * @category Array
42642    * @param {...Array} [arrays] The arrays to inspect.
42643    * @returns {Array} Returns the new array of intersecting values.
42644    * @example
42645    *
42646    * _.intersection([2, 1], [2, 3]);
42647    * // => [2]
42648    */
42649   var intersection = baseRest(function(arrays) {
42650     var mapped = arrayMap(arrays, castArrayLikeObject);
42651     return (mapped.length && mapped[0] === arrays[0])
42652       ? baseIntersection(mapped)
42653       : [];
42654   });
42655
42656   /** Used as references for various `Number` constants. */
42657   var INFINITY$4 = 1 / 0;
42658
42659   /**
42660    * Recursively flattens `array`.
42661    *
42662    * @static
42663    * @memberOf _
42664    * @since 3.0.0
42665    * @category Array
42666    * @param {Array} array The array to flatten.
42667    * @returns {Array} Returns the new flattened array.
42668    * @example
42669    *
42670    * _.flattenDeep([1, [2, [3, [4]], 5]]);
42671    * // => [1, 2, 3, 4, 5]
42672    */
42673   function flattenDeep(array) {
42674     var length = array == null ? 0 : array.length;
42675     return length ? baseFlatten(array, INFINITY$4) : [];
42676   }
42677
42678   /**
42679    * This method is like `_.uniq` except that it accepts `comparator` which
42680    * is invoked to compare elements of `array`. The order of result values is
42681    * determined by the order they occur in the array.The comparator is invoked
42682    * with two arguments: (arrVal, othVal).
42683    *
42684    * @static
42685    * @memberOf _
42686    * @since 4.0.0
42687    * @category Array
42688    * @param {Array} array The array to inspect.
42689    * @param {Function} [comparator] The comparator invoked per element.
42690    * @returns {Array} Returns the new duplicate free array.
42691    * @example
42692    *
42693    * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
42694    *
42695    * _.uniqWith(objects, _.isEqual);
42696    * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
42697    */
42698   function uniqWith(array, comparator) {
42699     comparator = typeof comparator == 'function' ? comparator : undefined;
42700     return (array && array.length) ? baseUniq(array, undefined, comparator) : [];
42701   }
42702
42703   /**
42704    * Look for roads that can be connected to other roads with a short extension
42705    */
42706   function validationAlmostJunction() {
42707       var type = 'almost_junction';
42708
42709
42710       function isHighway(entity) {
42711           return entity.type === 'way' && entity.tags.highway && entity.tags.highway !== 'no';
42712       }
42713
42714       function isNoexit(node) {
42715           return node.tags.noexit && node.tags.noexit === 'yes';
42716       }
42717
42718       function isExtendableCandidate(node, way, graph) {
42719           if (isNoexit(node) || graph.parentWays(node).length !== 1) {
42720               return false;
42721           }
42722           var occurences = 0;
42723           for (var index in way.nodes) {
42724               if (way.nodes[index] === node.id) {
42725                   occurences += 1;
42726                   if (occurences > 1) {
42727                       return false;
42728                   }
42729               }
42730           }
42731           return true;
42732       }
42733
42734       function findConnectableEndNodesByExtension(way, graph, tree) {
42735
42736           var results = [];
42737
42738           if (way.isClosed()) return results;
42739
42740           var nidFirst = way.nodes[0];
42741           var nidLast = way.nodes[way.nodes.length - 1];
42742           var nodeFirst = graph.entity(nidFirst);
42743           var nodeLast = graph.entity(nidLast);
42744
42745           var testNodes;
42746
42747           if (isExtendableCandidate(nodeFirst, way, graph)) {
42748               var connNearFirst = canConnectByExtend(way, 0, graph, tree);
42749               if (connNearFirst !== null) {
42750                   testNodes = cloneDeep(graph.childNodes(way));
42751                   testNodes[0].loc = connNearFirst.cross_loc;
42752                   // don't flag issue if connecting the ways would cause self-intersection
42753                   if (!geoHasSelfIntersections(testNodes, nodeFirst.id)) {
42754                       results.push({
42755                           node: nodeFirst,
42756                           wid: connNearFirst.wid,
42757                           edge: connNearFirst.edge,
42758                           cross_loc: connNearFirst.cross_loc
42759                       });
42760                   }
42761               }
42762           }
42763
42764           if (isExtendableCandidate(nodeLast, way, graph)) {
42765               var connNearLast = canConnectByExtend(way, way.nodes.length - 1, graph, tree);
42766               if (connNearLast !== null) {
42767                   testNodes = cloneDeep(graph.childNodes(way));
42768                   testNodes[testNodes.length-1].loc = connNearLast.cross_loc;
42769                   // don't flag issue if connecting the ways would cause self-intersection
42770                   if (!geoHasSelfIntersections(testNodes, nodeLast.id)) {
42771                       results.push({
42772                           node: nodeLast,
42773                           wid: connNearLast.wid,
42774                           edge: connNearLast.edge,
42775                           cross_loc: connNearLast.cross_loc
42776                       });
42777                   }
42778               }
42779           }
42780           return results;
42781       }
42782
42783
42784       function canConnectByExtend(way, endNodeIdx, graph, tree) {
42785           var EXTEND_TH_METERS = 5;
42786           var tipNid = way.nodes[endNodeIdx];  // the 'tip' node for extension point
42787           var midNid = endNodeIdx === 0 ? way.nodes[1] : way.nodes[way.nodes.length - 2];  // the other node of the edge
42788           var tipNode = graph.entity(tipNid);
42789           var midNode = graph.entity(midNid);
42790           var lon = tipNode.loc[0];
42791           var lat = tipNode.loc[1];
42792           var lon_range = geoMetersToLon(EXTEND_TH_METERS, lat) / 2;
42793           var lat_range = geoMetersToLat(EXTEND_TH_METERS) / 2;
42794           var queryExtent = geoExtent([
42795               [lon - lon_range, lat - lat_range],
42796               [lon + lon_range, lat + lat_range]
42797           ]);
42798
42799           // first, extend the edge of [midNode -> tipNode] by EXTEND_TH_METERS and find the "extended tip" location
42800           var edgeLen = geoSphericalDistance(midNode.loc, tipNode.loc);
42801           var t = EXTEND_TH_METERS / edgeLen + 1.0;
42802           var extTipLoc = geoVecInterp(midNode.loc, tipNode.loc, t);
42803
42804           // then, check if the extension part [tipNode.loc -> extTipLoc] intersects any other ways
42805           var intersected = tree.intersects(queryExtent, graph);
42806           for (var i = 0; i < intersected.length; i++) {
42807               if (!isHighway(intersected[i]) || intersected[i].id === way.id) continue;
42808
42809               var way2 = intersected[i];
42810               for (var j = 0; j < way2.nodes.length - 1; j++) {
42811                   var nA = graph.entity(way2.nodes[j]);
42812                   var nB = graph.entity(way2.nodes[j + 1]);
42813                   var crossLoc = geoLineIntersection([tipNode.loc, extTipLoc], [nA.loc, nB.loc]);
42814                   if (crossLoc !== null) {
42815                       return {
42816                           wid: way2.id,
42817                           edge: [nA.id, nB.id],
42818                           cross_loc: crossLoc
42819                       };
42820                   }
42821               }
42822           }
42823           return null;
42824       }
42825
42826
42827       var validation = function(endHighway, context) {
42828           if (!isHighway(endHighway)) return [];
42829
42830           var graph = context.graph();
42831           var tree = context.history().tree();
42832           var issues = [];
42833
42834           var extendableNodeInfos = findConnectableEndNodesByExtension(endHighway, graph, tree);
42835           extendableNodeInfos.forEach(function(extendableNodeInfo) {
42836               var node = extendableNodeInfo.node;
42837               var edgeHighway = graph.entity(extendableNodeInfo.wid);
42838
42839               var fixes = [new validationIssueFix({
42840                   icon: 'iD-icon-abutment',
42841                   title: t('issues.fix.connect_features.title'),
42842                   onClick: function() {
42843                       var endNode = this.issue.entities[1];
42844                       var targetEdge = this.issue.info.edge;
42845                       var crossLoc = this.issue.info.cross_loc;
42846                       var edgeNodes = [context.graph().entity(targetEdge[0]), context.graph().entity(targetEdge[1])];
42847                       var closestNodeInfo = geoSphericalClosestNode(edgeNodes, crossLoc);
42848
42849                       var annotation = t('issues.fix.connect_almost_junction.annotation');
42850                       // already a point nearby, just connect to that
42851                       if (closestNodeInfo.distance < 0.75) {
42852                           context.perform(
42853                               actionMergeNodes([closestNodeInfo.node.id, endNode.id], closestNodeInfo.node.loc),
42854                               annotation
42855                           );
42856                       // else add the end node to the edge way
42857                       } else {
42858                           context.perform(
42859                               actionAddMidpoint({loc: crossLoc, edge: targetEdge}, endNode),
42860                               annotation
42861                           );
42862                       }
42863                   }
42864               })];
42865
42866               if (Object.keys(node.tags).length === 0) {
42867                   // node has no tags, suggest noexit fix
42868                   fixes.push(new validationIssueFix({
42869                       icon: 'maki-barrier',
42870                       title: t('issues.fix.tag_as_disconnected.title'),
42871                       onClick: function() {
42872                           var nodeID = this.issue.entities[1].id;
42873                           context.perform(
42874                               actionChangeTags(nodeID, { noexit: 'yes' }),
42875                               t('issues.fix.tag_as_disconnected.annotation')
42876                           );
42877                       }
42878                   }));
42879               }
42880
42881               issues.push(new validationIssue({
42882                   type: type,
42883                   severity: 'warning',
42884                   message: t('issues.almost_junction.message', {
42885                       feature: utilDisplayLabel(endHighway, context),
42886                       feature2: utilDisplayLabel(edgeHighway, context)
42887                   }),
42888                   tooltip: t('issues.almost_junction.highway-highway.tip'),
42889                   entities: [endHighway, node, edgeHighway],
42890                   loc: extendableNodeInfo.node.loc,
42891                   info: {
42892                       edge: extendableNodeInfo.edge,
42893                       cross_loc: extendableNodeInfo.cross_loc
42894                   },
42895                   fixes: fixes
42896               }));
42897           });
42898
42899           return issues;
42900       };
42901
42902       validation.type = type;
42903
42904       return validation;
42905   }
42906
42907   function validationCrossingWays() {
42908       var type = 'crossing_ways';
42909
42910       // returns the way or its parent relation, whichever has a useful feature type
42911       function getFeatureWithFeatureTypeTagsForWay(way, graph) {
42912           if (getFeatureTypeForTags(way.tags) === null) {
42913               // if the way doesn't match a feature type, check is parent relations
42914               var parentRels = graph.parentRelations(way);
42915               for (var i = 0; i < parentRels.length; i++) {
42916                   var rel = parentRels[i];
42917                   if (getFeatureTypeForTags(rel.tags) !== null) {
42918                       return rel;
42919                   }
42920               }
42921           }
42922           return way;
42923       }
42924
42925
42926       function hasTag(tags, key) {
42927           return tags[key] !== undefined && tags[key] !== 'no';
42928       }
42929
42930       function tagsImplyIndoors(tags) {
42931           return hasTag(tags, 'level') || tags.highway === 'corridor';
42932       }
42933
42934       function allowsStructures(featureType) {
42935           return allowsBridge(featureType) || allowsTunnel(featureType);
42936       }
42937       function allowsBridge(featureType) {
42938           return featureType === 'highway' || featureType === 'railway' || featureType === 'waterway';
42939       }
42940       function allowsTunnel(featureType) {
42941           return featureType === 'highway' || featureType === 'railway' || featureType === 'waterway';
42942       }
42943       function canCover(featureType) {
42944           return featureType === 'building';
42945       }
42946
42947
42948       function getFeatureTypeForCrossingCheck(way, graph) {
42949           var tags = getFeatureWithFeatureTypeTagsForWay(way, graph).tags;
42950           return getFeatureTypeForTags(tags);
42951       }
42952
42953
42954       // only validate certain waterway features
42955       var waterways = ['canal', 'ditch', 'drain', 'river', 'stream'];
42956       // ignore certain highway and railway features
42957       var ignoredHighways = ['rest_area', 'services'];
42958       var ignoredRailways = ['train_wash'];
42959
42960
42961       function getFeatureTypeForTags(tags) {
42962           if (hasTag(tags, 'building')) return 'building';
42963
42964           // don't check non-building areas
42965           if (hasTag(tags, 'area')) return null;
42966
42967           if (hasTag(tags, 'highway') && ignoredHighways.indexOf(tags.highway) === -1) return 'highway';
42968           if (hasTag(tags, 'railway') && ignoredRailways.indexOf(tags.railway) === -1) return 'railway';
42969           if (hasTag(tags, 'waterway') && waterways.indexOf(tags.waterway) !== -1) return 'waterway';
42970
42971           return null;
42972       }
42973
42974
42975       function isLegitCrossing(way1, featureType1, way2, featureType2) {
42976           var tags1 = way1.tags;
42977           var tags2 = way2.tags;
42978
42979           // assume 0 by default
42980           var level1 = tags1.level || '0';
42981           var level2 = tags2.level || '0';
42982
42983           if (tagsImplyIndoors(tags1) && tagsImplyIndoors(tags2) && level1 !== level2) {
42984               // assume features don't interact if they're indoor on different levels
42985               return true;
42986           }
42987
42988           // assume 0 by default; don't use way.layer() since we account for structures here
42989           var layer1 = tags1.layer || '0';
42990           var layer2 = tags2.layer || '0';
42991
42992           if (allowsBridge(featureType1) && allowsBridge(featureType2)) {
42993               if (hasTag(tags1, 'bridge') && !hasTag(tags2, 'bridge')) return true;
42994               if (!hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge')) return true;
42995               // crossing bridges must use different layers
42996               if (hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge') && layer1 !== layer2) return true;
42997           } else if (allowsBridge(featureType1) && hasTag(tags1, 'bridge')) return true;
42998           else if (allowsBridge(featureType2) && hasTag(tags2, 'bridge')) return true;
42999
43000           if (allowsTunnel(featureType1) && allowsTunnel(featureType2)) {
43001               if (hasTag(tags1, 'tunnel') && !hasTag(tags2, 'tunnel')) return true;
43002               if (!hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel')) return true;
43003               // crossing tunnels must use different layers
43004               if (hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel') && layer1 !== layer2) return true;
43005           } else if (allowsTunnel(featureType1) && hasTag(tags1, 'tunnel')) return true;
43006           else if (allowsTunnel(featureType2) && hasTag(tags2, 'tunnel')) return true;
43007
43008           if (canCover(featureType1) && canCover(featureType2)) {
43009               if (hasTag(tags1, 'covered') && !hasTag(tags2, 'covered')) return true;
43010               if (!hasTag(tags1, 'covered') && hasTag(tags2, 'covered')) return true;
43011               // crossing covered features that can themselves cover must use different layers
43012               if (hasTag(tags1, 'covered') && hasTag(tags2, 'covered') && layer1 !== layer2) return true;
43013           } else if (canCover(featureType1) && hasTag(tags2, 'covered')) return true;
43014           else if (canCover(featureType2) && hasTag(tags1, 'covered')) return true;
43015
43016           if (!allowsStructures(featureType1) && !allowsStructures(featureType2)) {
43017               // if no structures are applicable, the layers must be different
43018               if (layer1 !== layer2) return true;
43019           }
43020           return false;
43021       }
43022
43023
43024       // highway values for which we shouldn't recommend connecting to waterways
43025       var highwaysDisallowingFords = [
43026           'motorway', 'motorway_link', 'trunk', 'trunk_link',
43027           'primary', 'primary_link', 'secondary', 'secondary_link'
43028       ];
43029       var pathHighways = [
43030           'path', 'footway', 'cycleway', 'bridleway', 'pedestrian', 'steps', 'corridor'
43031       ];
43032
43033       function tagsForConnectionNodeIfAllowed(entity1, entity2) {
43034           var featureType1 = getFeatureTypeForTags(entity1.tags);
43035           var featureType2 = getFeatureTypeForTags(entity2.tags);
43036           if (featureType1 === featureType2) {
43037               if (featureType1 === 'highway') {
43038                   var entity1IsPath = pathHighways.indexOf(entity1.tags.highway) !== -1;
43039                   var entity2IsPath = pathHighways.indexOf(entity2.tags.highway) !== -1;
43040                   if ((entity1IsPath || entity2IsPath) && entity1IsPath !== entity2IsPath) {
43041                       // one feature is a path but not both, use a crossing
43042
43043                       var pathFeature = entity1IsPath ? entity1 : entity2;
43044                       if (pathFeature.tags.highway === 'footway' &&
43045                           pathFeature.tags.footway === 'crossing' &&
43046                           ['marked', 'unmarked'].indexOf(pathFeature.tags.crossing) !== -1) {
43047                           // if the path is a crossing, match the crossing type
43048                           return { highway: 'crossing', crossing: pathFeature.tags.crossing };
43049                       }
43050                       return { highway: 'crossing' };
43051                   }
43052                   return {};
43053               }
43054               if (featureType1 === 'waterway') return {};
43055               if (featureType1 === 'railway') return {};
43056
43057           } else {
43058               var featureTypes = [featureType1, featureType2];
43059               if (featureTypes.indexOf('highway') !== -1) {
43060                   if (featureTypes.indexOf('railway') !== -1) {
43061                       if (pathHighways.indexOf(entity1.tags.highway) !== -1 ||
43062                           pathHighways.indexOf(entity2.tags.highway) !== -1) {
43063                           // path-rail connections use this tag
43064                           return { railway: 'crossing' };
43065                       } else {
43066                           // road-rail connections use this tag
43067                           return { railway: 'level_crossing' };
43068                       }
43069                   }
43070
43071                   if (featureTypes.indexOf('waterway') !== -1) {
43072                       // do not allow fords on structures
43073                       if (hasTag(entity1.tags, 'tunnel') && hasTag(entity2.tags, 'tunnel')) return null;
43074                       if (hasTag(entity1.tags, 'bridge') && hasTag(entity2.tags, 'bridge')) return null;
43075
43076                       if (highwaysDisallowingFords.indexOf(entity1.tags.highway) !== -1 ||
43077                           highwaysDisallowingFords.indexOf(entity2.tags.highway) !== -1) {
43078                           // do not allow fords on major highways
43079                           return null;
43080                       }
43081                       return { ford: 'yes' };
43082                   }
43083               }
43084           }
43085           return null;
43086       }
43087
43088
43089       function findCrossingsByWay(way1, graph, tree) {
43090
43091           var edgeCrossInfos = [];
43092           if (way1.type !== 'way') return edgeCrossInfos;
43093
43094           var way1FeatureType = getFeatureTypeForCrossingCheck(way1, graph);
43095           if (way1FeatureType === null) return edgeCrossInfos;
43096
43097           var checkedSingleCrossingWays = {};
43098
43099           // declare vars ahead of time to reduce garbage collection
43100           var i, j, nodeIndex;
43101           var extent;
43102           var n1, n2, nA, nB;
43103           var segment1, segment2;
43104           var oneOnly;
43105           var intersected, way2, way2FeatureType, way2Nodes;
43106           var way1Nodes = graph.childNodes(way1);
43107           for (i = 0; i < way1Nodes.length - 1; i++) {
43108               n1 = way1Nodes[i];
43109               n2 = way1Nodes[i + 1];
43110               extent = geoExtent([
43111                   [
43112                       Math.min(n1.loc[0], n2.loc[0]),
43113                       Math.min(n1.loc[1], n2.loc[1])
43114                   ],
43115                   [
43116                       Math.max(n1.loc[0], n2.loc[0]),
43117                       Math.max(n1.loc[1], n2.loc[1])
43118                   ]
43119               ]);
43120
43121               intersected = tree.intersects(extent, graph);
43122               for (j = 0; j < intersected.length; j++) {
43123                   way2 = intersected[j];
43124
43125                   if (way2.type !== 'way') continue;
43126
43127                   // skip if this way was already checked and only one issue is needed
43128                   if (checkedSingleCrossingWays[way2.id]) continue;
43129
43130                   // don't check for self-intersection in this validation
43131                   if (way2.id === way1.id) continue;
43132
43133                   // only check crossing highway, waterway, building, and railway
43134                   way2FeatureType = getFeatureTypeForCrossingCheck(way2, graph);
43135                   if (way2FeatureType === null ||
43136                       isLegitCrossing(way1, way1FeatureType, way2, way2FeatureType)) {
43137                       continue;
43138                   }
43139
43140                   // create only one issue for building crossings
43141                   oneOnly = way1FeatureType === 'building' || way2FeatureType === 'building';
43142                   segment1 = [n1.loc, n2.loc];
43143
43144                   way2Nodes = graph.childNodes(way2);
43145                   for (nodeIndex = 0; nodeIndex < way2Nodes.length - 1; nodeIndex++) {
43146                       nA = way2Nodes[nodeIndex];
43147                       nB = way2Nodes[nodeIndex + 1];
43148                       if (nA.id === n1.id || nA.id === n2.id ||
43149                           nB.id === n1.id || nB.id === n2.id) {
43150                           // n1 or n2 is a connection node; skip
43151                           continue;
43152                       }
43153                       segment2 = [nA.loc, nB.loc];
43154                       var point = geoLineIntersection(segment1, segment2);
43155                       if (point) {
43156                           edgeCrossInfos.push({
43157                               ways: [way1, way2],
43158                               featureTypes: [way1FeatureType, way2FeatureType],
43159                               edges: [[n1.id, n2.id], [nA.id, nB.id]],
43160                               crossPoint: point
43161                           });
43162                           if (oneOnly) {
43163                               checkedSingleCrossingWays[way2.id] = true;
43164                               break;
43165                           }
43166                       }
43167                   }
43168               }
43169           }
43170           return edgeCrossInfos;
43171       }
43172
43173
43174       function waysToCheck(entity, context) {
43175           if (!getFeatureTypeForTags(entity.tags)) {
43176               return [];
43177           }
43178           if (entity.type === 'way') {
43179               return [entity];
43180           } else if (entity.type === 'relation' &&
43181               entity.isMultipolygon() &&
43182               // only check multipolygons if they are buildings
43183               hasTag(entity.tags, 'building')) {
43184               return entity.members.reduce(function(array, member) {
43185                   if (member.type === 'way' &&
43186                       //(member.role === 'outer' || member.role === 'inner') &&
43187                       context.hasEntity(member.id)) {
43188                       var entity = context.entity(member.id);
43189                       array.push(entity);
43190                   }
43191                   return array;
43192               }, []);
43193           }
43194           return [];
43195       }
43196
43197       var validation = function(entity, context) {
43198           var graph = context.graph();
43199           var tree = context.history().tree();
43200
43201           var ways = waysToCheck(entity, context);
43202
43203           var issues = [];
43204           for (var wayIndex in ways) {
43205               var crossings = findCrossingsByWay(ways[wayIndex], graph, tree);
43206               for (var crossingIndex in crossings) {
43207                   issues.push(createIssue(crossings[crossingIndex], context));
43208               }
43209           }
43210           return issues;
43211       };
43212
43213
43214       function createIssue(crossing, context) {
43215           var graph = context.graph();
43216
43217           // use the entities with the tags that define the feature type
43218           var entities = crossing.ways.sort(function(entity1, entity2) {
43219               var type1 = getFeatureTypeForCrossingCheck(entity1, graph);
43220               var type2 = getFeatureTypeForCrossingCheck(entity2, graph);
43221               if (type1 === type2) {
43222                   return utilDisplayLabel(entity1, context) > utilDisplayLabel(entity2, context);
43223               } else if (type1 === 'waterway') {
43224                   return true;
43225               } else if (type2 === 'waterway') {
43226                   return false;
43227               }
43228               return type1 < type2;
43229           });
43230           entities = entities.map(function(way) {
43231               return getFeatureWithFeatureTypeTagsForWay(way, graph);
43232           });
43233
43234           var connectionTags = tagsForConnectionNodeIfAllowed(entities[0], entities[1]);
43235
43236           var featureType1 = crossing.featureTypes[0];
43237           var featureType2 = crossing.featureTypes[1];
43238
43239           var isCrossingIndoors = tagsImplyIndoors(entities[0].tags) && tagsImplyIndoors(entities[1].tags);
43240           var isCrossingTunnels = allowsTunnel(featureType1) && hasTag(entities[0].tags, 'tunnel') &&
43241                                   allowsTunnel(featureType2) && hasTag(entities[1].tags, 'tunnel');
43242           var isCrossingBridges = allowsBridge(featureType1) && hasTag(entities[0].tags, 'bridge') &&
43243                                   allowsBridge(featureType2) && hasTag(entities[1].tags, 'bridge');
43244
43245           var crossingTypeID;
43246
43247           if (isCrossingIndoors) {
43248               crossingTypeID = 'indoor-indoor';
43249           } else if (isCrossingTunnels) {
43250               crossingTypeID = 'tunnel-tunnel';
43251           } else if (isCrossingBridges) {
43252               crossingTypeID = 'bridge-bridge';
43253           } else {
43254               crossingTypeID = crossing.featureTypes.sort().join('-');
43255           }
43256           if (connectionTags && (isCrossingIndoors || isCrossingTunnels || isCrossingBridges)) {
43257               crossingTypeID += '_connectable';
43258           }
43259
43260           var messageDict = {
43261               feature: utilDisplayLabel(entities[0], context),
43262               feature2: utilDisplayLabel(entities[1], context)
43263           };
43264
43265           var fixes = [];
43266           if (connectionTags) {
43267               fixes.push(new validationIssueFix({
43268                   icon: 'iD-icon-crossing',
43269                   title: t('issues.fix.connect_features.title'),
43270                   onClick: function() {
43271                       var loc = this.issue.loc;
43272                       var connectionTags = this.issue.info.connectionTags;
43273                       var edges = this.issue.info.edges;
43274
43275                       context.perform(
43276                           function actionConnectCrossingWays(graph) {
43277                               // create the new node for the points
43278                               var node = osmNode({ loc: loc, tags: connectionTags });
43279                               graph = graph.replace(node);
43280
43281                               var nodesToMerge = [node.id];
43282                               var mergeThresholdInMeters = 0.75;
43283
43284                               edges.forEach(function(edge) {
43285                                   var edgeNodes = [graph.entity(edge[0]), graph.entity(edge[1])];
43286                                   var closestNodeInfo = geoSphericalClosestNode(edgeNodes, loc);
43287                                   // if there is already a point nearby, use that
43288                                   if (closestNodeInfo.distance < mergeThresholdInMeters) {
43289                                       nodesToMerge.push(closestNodeInfo.node.id);
43290                                   // else add the new node to the way
43291                                   } else {
43292                                       graph = actionAddMidpoint({loc: loc, edge: edge}, node)(graph);
43293                                   }
43294                               });
43295
43296                               if (nodesToMerge.length > 1) {
43297                                   // if we're using nearby nodes, merge them with the new node
43298                                   graph = actionMergeNodes(nodesToMerge, loc)(graph);
43299                               }
43300
43301                               return graph;
43302                           },
43303                           t('issues.fix.connect_crossing_features.annotation')
43304                       );
43305                   }
43306               }));
43307           }
43308           var useFixIcon = 'iD-icon-layers';
43309           var useFixID;
43310           if (isCrossingIndoors) {
43311               useFixID = 'use_different_levels';
43312           } else if (isCrossingTunnels || isCrossingBridges) {
43313               useFixID = 'use_different_layers';
43314           // don't recommend bridges for waterways even though they're okay
43315           } else if ((allowsBridge(featureType1) && featureType1 !== 'waterway') ||
43316                   (allowsBridge(featureType2) && featureType2 !== 'waterway')) {
43317               useFixID = 'use_bridge_or_tunnel';
43318               useFixIcon = 'maki-bridge';
43319           } else if (allowsTunnel(featureType1) || allowsTunnel(featureType2)) {
43320               useFixID = 'use_tunnel';
43321           } else {
43322               useFixID = 'use_different_layers';
43323           }
43324           fixes.push(new validationIssueFix({
43325               icon: useFixIcon,
43326               title: t('issues.fix.' + useFixID + '.title')
43327           }));
43328           fixes.push(new validationIssueFix({
43329               icon: 'iD-operation-move',
43330               title: t('issues.fix.reposition_features.title')
43331           }));
43332           return new validationIssue({
43333               type: type,
43334               severity: 'warning',
43335               message: t('issues.crossing_ways.message', messageDict),
43336               tooltip: t('issues.crossing_ways.'+crossingTypeID+'.tip'),
43337               entities: entities,
43338               info: { edges: crossing.edges, connectionTags: connectionTags },
43339               loc: crossing.crossPoint,
43340               fixes: fixes
43341           });
43342       }
43343
43344       validation.type = type;
43345
43346       return validation;
43347   }
43348
43349   function validationDeprecatedTag() {
43350       var type = 'deprecated_tag';
43351
43352
43353       var validation = function(entity, context) {
43354           var issues = [];
43355           var deprecatedTagsArray = entity.deprecatedTags();
43356           if (deprecatedTagsArray.length > 0) {
43357               for (var deprecatedTagIndex in deprecatedTagsArray) {
43358                   var deprecatedTags = deprecatedTagsArray[deprecatedTagIndex];
43359                   var labelTags = clone(deprecatedTags.old);
43360                   for (var key in labelTags) {
43361                       if (labelTags[key] === '*') {
43362                           // show the user the actual tag, like color=red instead of color=*
43363                           labelTags[key] = entity.tags[key];
43364                       }
43365                   }
43366                   var tagsLabel = utilTagText({ tags: labelTags });
43367                   var featureLabel = utilDisplayLabel(entity, context);
43368                   var isCombo = Object.keys(deprecatedTags.old).length > 1;
43369                   var messageObj = { feature: featureLabel };
43370                   if (isCombo) {
43371                       messageObj.tags = tagsLabel;
43372                   } else {
43373                       messageObj.tag = tagsLabel;
43374                   }
43375                   var tagMessageID = isCombo ? 'combination' : 'single';
43376                   issues.push(new validationIssue({
43377                       type: type,
43378                       severity: 'warning',
43379                       message: t('issues.deprecated_tag.' + tagMessageID + '.message', messageObj),
43380                       tooltip: t('issues.deprecated_tag.tip'),
43381                       entities: [entity],
43382                       hash: tagsLabel,
43383                       info: {
43384                           oldTags: deprecatedTags.old,
43385                           replaceTags: deprecatedTags.replace
43386                       },
43387                       fixes: [
43388                           new validationIssueFix({
43389                               icon: 'iD-icon-up',
43390                               title: t('issues.fix.' + (isCombo ? 'upgrade_tag_combo' : 'upgrade_tag') + '.title'),
43391                               onClick: function() {
43392                                   var entity = this.issue.entities[0];
43393                                   var tags = clone(entity.tags);
43394                                   var replaceTags = this.issue.info.replaceTags;
43395                                   var oldTags = this.issue.info.oldTags;
43396                                   var fixTextID = Object.keys(oldTags).length > 1 ? 'upgrade_tag_combo' : 'upgrade_tag';
43397                                   var transferValue;
43398                                   for (var oldTagKey in oldTags) {
43399                                       if (oldTags[oldTagKey] === '*') {
43400                                           transferValue = tags[oldTagKey];
43401                                       }
43402                                       delete tags[oldTagKey];
43403                                   }
43404                                   for (var replaceKey in replaceTags) {
43405                                       var replaceValue = replaceTags[replaceKey];
43406                                       if (replaceValue === '*') {
43407                                           if (tags[replaceKey]) {
43408                                               // any value is okay and there already
43409                                               // is one, so don't update it
43410                                               continue;
43411                                           } else {
43412                                               // otherwise assume `yes` is okay
43413                                               tags[replaceKey] = 'yes';
43414                                           }
43415                                       } else if (replaceValue === '$1') {
43416                                           tags[replaceKey] = transferValue;
43417                                       } else {
43418                                           tags[replaceKey] = replaceValue;
43419                                       }
43420                                   }
43421                                   context.perform(
43422                                       actionChangeTags(entity.id, tags),
43423                                       t('issues.fix.' + fixTextID + '.annotation')
43424                                   );
43425                               }
43426                           }),
43427                           new validationIssueFix({
43428                               icon: 'iD-operation-delete',
43429                               title: t('issues.fix.' + (isCombo ? 'remove_tags' : 'remove_tag') + '.title'),
43430                               onClick: function() {
43431                                   var entity = this.issue.entities[0];
43432                                   var tags = clone(entity.tags);
43433                                   var oldTags = this.issue.info.oldTags;
43434                                   for (var key in oldTags) {
43435                                       delete tags[key];
43436                                   }
43437                                   var fixTextID = Object.keys(oldTags).length > 1 ? 'remove_deprecated_tag_combo' : 'remove_deprecated_tag';
43438                                   context.perform(
43439                                       actionChangeTags(entity.id, tags),
43440                                       t('issues.fix.' + fixTextID + '.annotation')
43441                                   );
43442                               }
43443                           })
43444                       ]
43445                   }));
43446               }
43447           }
43448
43449           return issues;
43450       };
43451
43452       validation.type = type;
43453
43454       return validation;
43455   }
43456
43457   function operationCircularize(selectedIDs, context) {
43458       var entityId = selectedIDs[0],
43459           entity = context.entity(entityId),
43460           extent = entity.extent(context.graph()),
43461           geometry = context.geometry(entityId),
43462           action = actionCircularize(entityId, context.projection);
43463
43464
43465       var operation = function() {
43466           context.perform(action, operation.annotation());
43467       };
43468
43469
43470       operation.available = function() {
43471           return selectedIDs.length === 1 &&
43472               entity.type === 'way' &&
43473               uniq(entity.nodes).length > 1;
43474       };
43475
43476
43477       operation.disabled = function() {
43478           var reason;
43479           if (extent.percentContainedIn(context.extent()) < 0.8) {
43480               reason = 'too_large';
43481           } else if (context.hasHiddenConnections(entityId)) {
43482               reason = 'connected_to_hidden';
43483           }
43484           return action.disabled(context.graph()) || reason;
43485       };
43486
43487
43488       operation.tooltip = function() {
43489           var disable = operation.disabled();
43490           return disable ?
43491               t('operations.circularize.' + disable) :
43492               t('operations.circularize.description.' + geometry);
43493       };
43494
43495
43496       operation.annotation = function() {
43497           return t('operations.circularize.annotation.' + geometry);
43498       };
43499
43500
43501       operation.id = 'circularize';
43502       operation.keys = [t('operations.circularize.key')];
43503       operation.title = t('operations.circularize.title');
43504       operation.behavior = behaviorOperation(context).which(operation);
43505
43506       return operation;
43507   }
43508
43509   function operationContinue(selectedIDs, context) {
43510       var graph = context.graph(),
43511           entities = selectedIDs.map(function(id) { return graph.entity(id); }),
43512           geometries = assignIn({ line: [], vertex: [] },
43513               groupBy(entities, function(entity) { return entity.geometry(graph); })),
43514           vertex = geometries.vertex[0];
43515
43516
43517       function candidateWays() {
43518           return graph.parentWays(vertex).filter(function(parent) {
43519               return parent.geometry(graph) === 'line' &&
43520                   !parent.isClosed() &&
43521                   parent.affix(vertex.id) &&
43522                   (geometries.line.length === 0 || geometries.line[0] === parent);
43523           });
43524       }
43525
43526
43527       var operation = function() {
43528           var candidate = candidateWays()[0];
43529           context.enter(
43530               modeDrawLine(context, candidate.id, context.graph(), context.graph(), candidate.affix(vertex.id), true)
43531           );
43532       };
43533
43534
43535       operation.available = function() {
43536           return geometries.vertex.length === 1 && geometries.line.length <= 1 &&
43537               !context.features().hasHiddenConnections(vertex, context.graph());
43538       };
43539
43540
43541       operation.disabled = function() {
43542           var candidates = candidateWays();
43543           if (candidates.length === 0)
43544               return 'not_eligible';
43545           if (candidates.length > 1)
43546               return 'multiple';
43547       };
43548
43549
43550       operation.tooltip = function() {
43551           var disable = operation.disabled();
43552           return disable ?
43553               t('operations.continue.' + disable) :
43554               t('operations.continue.description');
43555       };
43556
43557
43558       operation.annotation = function() {
43559           return t('operations.continue.annotation.line');
43560       };
43561
43562
43563       operation.id = 'continue';
43564       operation.keys = [t('operations.continue.key')];
43565       operation.title = t('operations.continue.title');
43566       operation.behavior = behaviorOperation(context).which(operation);
43567
43568       return operation;
43569   }
43570
43571   function operationDelete(selectedIDs, context) {
43572       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
43573           action = actionDeleteMultiple(selectedIDs),
43574           extent = selectedIDs.reduce(function(extent, id) {
43575                   return extent.extend(context.entity(id).extent(context.graph()));
43576               }, geoExtent());
43577
43578
43579       var operation = function() {
43580           var nextSelectedID;
43581           var nextSelectedLoc;
43582
43583           if (selectedIDs.length === 1) {
43584               var id = selectedIDs[0],
43585                   entity = context.entity(id),
43586                   geometry = context.geometry(id),
43587                   parents = context.graph().parentWays(entity),
43588                   parent = parents[0];
43589
43590               // Select the next closest node in the way.
43591               if (geometry === 'vertex') {
43592                   var nodes = parent.nodes,
43593                       i = nodes.indexOf(id);
43594
43595                   if (i === 0) {
43596                       i++;
43597                   } else if (i === nodes.length - 1) {
43598                       i--;
43599                   } else {
43600                       var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc),
43601                           b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
43602                       i = a < b ? i - 1 : i + 1;
43603                   }
43604
43605                   nextSelectedID = nodes[i];
43606                   nextSelectedLoc = context.entity(nextSelectedID).loc;
43607               }
43608           }
43609
43610           context.perform(action, operation.annotation());
43611
43612           if (nextSelectedID && nextSelectedLoc) {
43613               if (context.hasEntity(nextSelectedID)) {
43614                   context.enter(modeSelect(context, [nextSelectedID]).follow(true));
43615               } else {
43616                   context.map().centerEase(nextSelectedLoc);
43617                   context.enter(modeBrowse(context));
43618               }
43619           } else {
43620               context.enter(modeBrowse(context));
43621           }
43622
43623       };
43624
43625
43626       operation.available = function() {
43627           return true;
43628       };
43629
43630
43631       operation.disabled = function() {
43632           var reason;
43633           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
43634               reason = 'too_large';
43635           } else if (some(selectedIDs, context.hasHiddenConnections)) {
43636               reason = 'connected_to_hidden';
43637           } else if (some(selectedIDs, protectedMember)) {
43638               reason = 'part_of_relation';
43639           } else if (some(selectedIDs, incompleteRelation)) {
43640               reason = 'incomplete_relation';
43641           }
43642           return reason;
43643
43644           function incompleteRelation(id) {
43645               var entity = context.entity(id);
43646               return entity.type === 'relation' && !entity.isComplete(context.graph());
43647           }
43648
43649           function protectedMember(id) {
43650               var entity = context.entity(id);
43651               if (entity.type !== 'way') return false;
43652
43653               var parents = context.graph().parentRelations(entity);
43654               for (var i = 0; i < parents.length; i++) {
43655                   var parent = parents[i],
43656                       type = parent.tags.type,
43657                       role = parent.memberById(id).role || 'outer';
43658                   if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) {
43659                       return true;
43660                   }
43661               }
43662               return false;
43663           }
43664
43665       };
43666
43667
43668       operation.tooltip = function() {
43669           var disable = operation.disabled();
43670           return disable ?
43671               t('operations.delete.' + disable + '.' + multi) :
43672               t('operations.delete.description' + '.' + multi);
43673       };
43674
43675
43676       operation.annotation = function() {
43677           return selectedIDs.length === 1 ?
43678               t('operations.delete.annotation.' + context.geometry(selectedIDs[0])) :
43679               t('operations.delete.annotation.multiple', { n: selectedIDs.length });
43680       };
43681
43682
43683       operation.id = 'delete';
43684       operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
43685       operation.title = t('operations.delete.title');
43686       operation.behavior = behaviorOperation(context).which(operation);
43687
43688       return operation;
43689   }
43690
43691   function operationDisconnect(selectedIDs, context) {
43692       var vertices = filter(selectedIDs, function(entityId) {
43693           return context.geometry(entityId) === 'vertex';
43694       });
43695
43696       var entityId = vertices[0],
43697           action = actionDisconnect(entityId);
43698
43699       if (selectedIDs.length > 1) {
43700           action.limitWays(without(selectedIDs, entityId));
43701       }
43702
43703
43704       var operation = function() {
43705           context.perform(action, operation.annotation());
43706       };
43707
43708
43709       operation.available = function() {
43710           return vertices.length === 1;
43711       };
43712
43713
43714       operation.disabled = function() {
43715           var reason;
43716           if (some(selectedIDs, context.hasHiddenConnections)) {
43717               reason = 'connected_to_hidden';
43718           }
43719           return action.disabled(context.graph()) || reason;
43720       };
43721
43722
43723       operation.tooltip = function() {
43724           var disable = operation.disabled();
43725           return disable ?
43726               t('operations.disconnect.' + disable) :
43727               t('operations.disconnect.description');
43728       };
43729
43730
43731       operation.annotation = function() {
43732           return t('operations.disconnect.annotation');
43733       };
43734
43735
43736       operation.id = 'disconnect';
43737       operation.keys = [t('operations.disconnect.key')];
43738       operation.title = t('operations.disconnect.title');
43739       operation.behavior = behaviorOperation(context).which(operation);
43740
43741       return operation;
43742   }
43743
43744   function operationMerge(selectedIDs, context) {
43745
43746       function updatePresetTags(newGraph, ids) {
43747           var id = ids[0];
43748           var newEntity = newGraph.hasEntity(id);
43749
43750           if (!newEntity) return;
43751           var newPreset = context.presets().match(newEntity, newGraph);
43752           context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
43753       }
43754
43755
43756       var join = actionJoin(selectedIDs);
43757       var merge = actionMerge(selectedIDs);
43758       var mergePolygon = actionMergePolygon(selectedIDs);
43759       var mergeNodes = actionMergeNodes(selectedIDs);
43760
43761
43762       var operation = function() {
43763           var doUpdateTags;
43764           var action;
43765
43766           if (!join.disabled(context.graph())) {
43767               doUpdateTags = false;
43768               action = join;
43769           } else if (!merge.disabled(context.graph())) {
43770               doUpdateTags = true;
43771               action = merge;
43772           } else if (!mergePolygon.disabled(context.graph())) {
43773               doUpdateTags = false;
43774               action = mergePolygon;
43775           } else {
43776               doUpdateTags = true;
43777               action = mergeNodes;
43778           }
43779
43780           context.perform(action, operation.annotation());
43781
43782           var ids = selectedIDs.filter(function(id) {
43783               var entity = context.hasEntity(id);
43784               return entity && entity.type !== 'node';
43785           });
43786
43787           // if we merged tags, rematch preset to update tags if necessary (#3851)
43788           if (doUpdateTags) {
43789               updatePresetTags(context.graph(), ids);
43790           }
43791
43792           context.enter(modeSelect(context, ids));
43793       };
43794
43795
43796       operation.available = function() {
43797           return selectedIDs.length >= 2;
43798       };
43799
43800
43801       operation.disabled = function() {
43802           return join.disabled(context.graph()) &&
43803               merge.disabled(context.graph()) &&
43804               mergePolygon.disabled(context.graph()) &&
43805               mergeNodes.disabled(context.graph());
43806       };
43807
43808
43809       operation.tooltip = function() {
43810           var j = join.disabled(context.graph());          // 'not_eligible', 'not_adjacent', 'restriction', 'conflicting_tags'
43811           var m = merge.disabled(context.graph());         // 'not_eligible'
43812           var p = mergePolygon.disabled(context.graph());  // 'not_eligible', 'incomplete_relation'
43813           var n = mergeNodes.disabled(context.graph());    // 'not_eligible', 'relation', 'restriction'
43814
43815           // disabled for one of various reasons
43816           if (j && m && p && n) {
43817               if (j === 'restriction' || n === 'restriction') {
43818                   return t('operations.merge.restriction',
43819                       { relation: context.presets().item('type/restriction').name() });
43820
43821               } else if (p === 'incomplete_relation') {
43822                   return t('operations.merge.incomplete_relation');
43823
43824               } else if (n === 'relation') {
43825                   return t('operations.merge.relation');
43826
43827               } else {
43828                   return t('operations.merge.' + j);
43829               }
43830
43831           } else {
43832               return t('operations.merge.description');
43833           }
43834       };
43835
43836
43837       operation.annotation = function() {
43838           return t('operations.merge.annotation', { n: selectedIDs.length });
43839       };
43840
43841
43842       operation.id = 'merge';
43843       operation.keys = [t('operations.merge.key')];
43844       operation.title = t('operations.merge.title');
43845       operation.behavior = behaviorOperation(context).which(operation);
43846
43847       return operation;
43848   }
43849
43850   function operationMove(selectedIDs, context) {
43851       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
43852       var extent = selectedIDs.reduce(function(extent, id) {
43853           return extent.extend(context.entity(id).extent(context.graph()));
43854       }, geoExtent());
43855
43856
43857       var operation = function() {
43858           context.enter(modeMove(context, selectedIDs));
43859       };
43860
43861
43862       operation.available = function() {
43863           return selectedIDs.length > 1 ||
43864               context.entity(selectedIDs[0]).type !== 'node';
43865       };
43866
43867
43868       operation.disabled = function() {
43869           var reason;
43870           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
43871               reason = 'too_large';
43872           } else if (some(selectedIDs, context.hasHiddenConnections)) {
43873               reason = 'connected_to_hidden';
43874           } else if (some(selectedIDs, incompleteRelation)) {
43875               reason = 'incomplete_relation';
43876           }
43877           return reason;
43878
43879           function incompleteRelation(id) {
43880               var entity = context.entity(id);
43881               return entity.type === 'relation' && !entity.isComplete(context.graph());
43882           }
43883       };
43884
43885
43886       operation.tooltip = function() {
43887           var disable = operation.disabled();
43888           return disable ?
43889               t('operations.move.' + disable + '.' + multi) :
43890               t('operations.move.description.' + multi);
43891       };
43892
43893
43894       operation.annotation = function() {
43895           return selectedIDs.length === 1 ?
43896               t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
43897               t('operations.move.annotation.multiple');
43898       };
43899
43900
43901       operation.id = 'move';
43902       operation.keys = [t('operations.move.key')];
43903       operation.title = t('operations.move.title');
43904       operation.behavior = behaviorOperation(context).which(operation);
43905
43906       return operation;
43907   }
43908
43909   function operationOrthogonalize(selectedIDs, context) {
43910       var entityId = selectedIDs[0],
43911           entity = context.entity(entityId),
43912           extent = entity.extent(context.graph()),
43913           geometry = context.geometry(entityId),
43914           action = actionOrthogonalize(entityId, context.projection);
43915
43916
43917       var operation = function() {
43918           context.perform(action, operation.annotation());
43919       };
43920
43921
43922       operation.available = function() {
43923           return selectedIDs.length === 1 &&
43924               entity.type === 'way' &&
43925               entity.isClosed() &&
43926               uniq(entity.nodes).length > 2;
43927       };
43928
43929
43930       operation.disabled = function() {
43931           var reason;
43932           if (extent.percentContainedIn(context.extent()) < 0.8) {
43933               reason = 'too_large';
43934           } else if (context.hasHiddenConnections(entityId)) {
43935               reason = 'connected_to_hidden';
43936           }
43937           return action.disabled(context.graph()) || reason;
43938       };
43939
43940
43941       operation.tooltip = function() {
43942           var disable = operation.disabled();
43943           return disable ?
43944               t('operations.orthogonalize.' + disable) :
43945               t('operations.orthogonalize.description.' + geometry);
43946       };
43947
43948
43949       operation.annotation = function() {
43950           return t('operations.orthogonalize.annotation.' + geometry);
43951       };
43952
43953
43954       operation.id = 'orthogonalize';
43955       operation.keys = [t('operations.orthogonalize.key')];
43956       operation.title = t('operations.orthogonalize.title');
43957       operation.behavior = behaviorOperation(context).which(operation);
43958
43959       return operation;
43960   }
43961
43962   /**
43963    * This method is like `_.uniq` except that it accepts `iteratee` which is
43964    * invoked for each element in `array` to generate the criterion by which
43965    * uniqueness is computed. The order of result values is determined by the
43966    * order they occur in the array. The iteratee is invoked with one argument:
43967    * (value).
43968    *
43969    * @static
43970    * @memberOf _
43971    * @since 4.0.0
43972    * @category Array
43973    * @param {Array} array The array to inspect.
43974    * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
43975    * @returns {Array} Returns the new duplicate free array.
43976    * @example
43977    *
43978    * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
43979    * // => [2.1, 1.2]
43980    *
43981    * // The `_.property` iteratee shorthand.
43982    * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
43983    * // => [{ 'x': 1 }, { 'x': 2 }]
43984    */
43985   function uniqBy(array, iteratee) {
43986     return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];
43987   }
43988
43989   function operationReflectShort(selectedIDs, context) {
43990       return operationReflect(selectedIDs, context, 'short');
43991   }
43992
43993
43994   function operationReflectLong(selectedIDs, context) {
43995       return operationReflect(selectedIDs, context, 'long');
43996   }
43997
43998
43999   function operationReflect(selectedIDs, context, axis) {
44000       axis = axis || 'long';
44001       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
44002           extent = selectedIDs.reduce(function(extent, id) {
44003               return extent.extend(context.entity(id).extent(context.graph()));
44004           }, geoExtent());
44005
44006
44007       var operation = function() {
44008           var action = actionReflect(selectedIDs, context.projection)
44009               .useLongAxis(Boolean(axis === 'long'));
44010           context.perform(action, operation.annotation());
44011       };
44012
44013
44014       operation.available = function() {
44015           var nodes = utilGetAllNodes(selectedIDs, context.graph());
44016           return uniqBy(nodes, function(n) { return n.loc; }).length >= 3;
44017       };
44018
44019
44020       operation.disabled = function() {
44021           var reason;
44022           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
44023               reason = 'too_large';
44024           } else if (some(selectedIDs, context.hasHiddenConnections)) {
44025               reason = 'connected_to_hidden';
44026           } else if (some(selectedIDs, incompleteRelation)) {
44027               reason = 'incomplete_relation';
44028           }
44029           return reason;
44030
44031           function incompleteRelation(id) {
44032               var entity = context.entity(id);
44033               return entity.type === 'relation' && !entity.isComplete(context.graph());
44034           }
44035       };
44036
44037
44038       operation.tooltip = function() {
44039           var disable = operation.disabled();
44040           return disable ?
44041               t('operations.reflect.' + disable + '.' + multi) :
44042               t('operations.reflect.description.' + axis + '.' + multi);
44043       };
44044
44045
44046       operation.annotation = function() {
44047           return t('operations.reflect.annotation.' + axis + '.' + multi);
44048       };
44049
44050
44051       operation.id = 'reflect-' + axis;
44052       operation.keys = [t('operations.reflect.key.' + axis)];
44053       operation.title = t('operations.reflect.title.' + axis);
44054       operation.behavior = behaviorOperation(context).which(operation);
44055
44056       return operation;
44057   }
44058
44059   function operationReverse(selectedIDs, context) {
44060       var entityId = selectedIDs[0];
44061
44062       var operation = function() {
44063           context.perform(actionReverse(entityId), operation.annotation());
44064       };
44065
44066
44067       operation.available = function() {
44068           return selectedIDs.length === 1 && context.geometry(entityId) === 'line';
44069       };
44070
44071
44072       operation.disabled = function() {
44073           return false;
44074       };
44075
44076
44077       operation.tooltip = function() {
44078           return t('operations.reverse.description');
44079       };
44080
44081
44082       operation.annotation = function() {
44083           return t('operations.reverse.annotation');
44084       };
44085
44086
44087       operation.id = 'reverse';
44088       operation.keys = [t('operations.reverse.key')];
44089       operation.title = t('operations.reverse.title');
44090       operation.behavior = behaviorOperation(context).which(operation);
44091
44092       return operation;
44093   }
44094
44095   function operationRotate(selectedIDs, context) {
44096       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
44097           extent = selectedIDs.reduce(function(extent, id) {
44098               return extent.extend(context.entity(id).extent(context.graph()));
44099           }, geoExtent());
44100
44101
44102       var operation = function() {
44103           context.enter(modeRotate(context, selectedIDs));
44104       };
44105
44106
44107       operation.available = function() {
44108           var nodes = utilGetAllNodes(selectedIDs, context.graph());
44109           return uniqBy(nodes, function(n) { return n.loc; }).length >= 2;
44110       };
44111
44112
44113       operation.disabled = function() {
44114           var reason;
44115           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
44116               reason = 'too_large';
44117           } else if (some(selectedIDs, context.hasHiddenConnections)) {
44118               reason = 'connected_to_hidden';
44119           } else if (some(selectedIDs, incompleteRelation)) {
44120               reason = 'incomplete_relation';
44121           }
44122           return reason;
44123
44124           function incompleteRelation(id) {
44125               var entity = context.entity(id);
44126               return entity.type === 'relation' && !entity.isComplete(context.graph());
44127           }
44128       };
44129
44130
44131       operation.tooltip = function() {
44132           var disable = operation.disabled();
44133           return disable ?
44134               t('operations.rotate.' + disable + '.' + multi) :
44135               t('operations.rotate.description.' + multi);
44136       };
44137
44138
44139       operation.annotation = function() {
44140           return selectedIDs.length === 1 ?
44141               t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
44142               t('operations.rotate.annotation.multiple');
44143       };
44144
44145
44146       operation.id = 'rotate';
44147       operation.keys = [t('operations.rotate.key')];
44148       operation.title = t('operations.rotate.title');
44149       operation.behavior = behaviorOperation(context).which(operation);
44150
44151       return operation;
44152   }
44153
44154   function operationSplit(selectedIDs, context) {
44155       var vertices = filter(selectedIDs, function(entityId) {
44156           return context.geometry(entityId) === 'vertex';
44157       });
44158
44159       var entityId = vertices[0],
44160           action = actionSplit(entityId),
44161           ways = [];
44162
44163       if (vertices.length === 1) {
44164           if (selectedIDs.length > 1) {
44165               action.limitWays(without(selectedIDs, entityId));
44166           }
44167           ways = action.ways(context.graph());
44168       }
44169
44170
44171       var operation = function() {
44172           var difference = context.perform(action, operation.annotation());
44173           context.enter(modeSelect(context, difference.extantIDs()));
44174       };
44175
44176
44177       operation.available = function() {
44178           return vertices.length === 1;
44179       };
44180
44181
44182       operation.disabled = function() {
44183           var reason;
44184           if (some(selectedIDs, context.hasHiddenConnections)) {
44185               reason = 'connected_to_hidden';
44186           }
44187           return action.disabled(context.graph()) || reason;
44188       };
44189
44190
44191       operation.tooltip = function() {
44192           var disable = operation.disabled();
44193           if (disable) {
44194               return t('operations.split.' + disable);
44195           }
44196           if (ways.length === 1) {
44197               return t('operations.split.description.' + context.geometry(ways[0].id));
44198           } else {
44199               return t('operations.split.description.multiple');
44200           }
44201       };
44202
44203
44204       operation.annotation = function() {
44205           return ways.length === 1 ?
44206               t('operations.split.annotation.' + context.geometry(ways[0].id)) :
44207               t('operations.split.annotation.multiple', { n: ways.length });
44208       };
44209
44210
44211       operation.id = 'split';
44212       operation.keys = [t('operations.split.key')];
44213       operation.title = t('operations.split.title');
44214       operation.behavior = behaviorOperation(context).which(operation);
44215
44216       return operation;
44217   }
44218
44219   function operationStraighten(selectedIDs, context) {
44220       var entityId = selectedIDs[0],
44221           action = actionStraighten(entityId, context.projection);
44222
44223
44224       function operation() {
44225           context.perform(action, operation.annotation());
44226       }
44227
44228
44229       operation.available = function() {
44230           var entity = context.entity(entityId);
44231           return selectedIDs.length === 1 &&
44232               entity.type === 'way' &&
44233               !entity.isClosed() &&
44234               uniq(entity.nodes).length > 2;
44235       };
44236
44237
44238       operation.disabled = function() {
44239           var reason;
44240           if (context.hasHiddenConnections(entityId)) {
44241               reason = 'connected_to_hidden';
44242           }
44243           return action.disabled(context.graph()) || reason;
44244       };
44245
44246
44247       operation.tooltip = function() {
44248           var disable = operation.disabled();
44249           return disable ?
44250               t('operations.straighten.' + disable) :
44251               t('operations.straighten.description');
44252       };
44253
44254
44255       operation.annotation = function() {
44256           return t('operations.straighten.annotation');
44257       };
44258
44259
44260       operation.id = 'straighten';
44261       operation.keys = [t('operations.straighten.key')];
44262       operation.title = t('operations.straighten.title');
44263       operation.behavior = behaviorOperation(context).which(operation);
44264
44265       return operation;
44266   }
44267
44268   function operationDetachNode(selectedIDs, context) {
44269       var nodeID = selectedIDs.length && selectedIDs[0];
44270       var action = actionDetachNode(nodeID);
44271
44272       var operation = function () {
44273           context.perform(action);  // do the detach
44274
44275           var mouse = context.map().mouseCoordinates();
44276           if (mouse.some(isNaN)) {
44277               enterMoveMode();
44278
44279           } else {
44280               // move detached node to the mouse location (transitioned)
44281               context.perform(actionMoveNode(nodeID, mouse));
44282
44283               // after transition completes, put at final mouse location and enter move mode.
44284               window.setTimeout(function() {
44285                   mouse = context.map().mouseCoordinates();
44286                   context.replace(actionMoveNode(nodeID, mouse));
44287                   enterMoveMode();
44288               }, 150);
44289           }
44290
44291           function enterMoveMode() {
44292               var baseGraph = context.graph();
44293               context.enter(modeMove(context, [nodeID], baseGraph));
44294           }
44295       };
44296
44297
44298       operation.available = function () {
44299           if (selectedIDs.length !== 1) return false;
44300
44301           var graph = context.graph();
44302           var entity = graph.hasEntity(nodeID);
44303           if (!entity) return false;
44304
44305           return entity.type === 'node' &&
44306               entity.hasInterestingTags() &&
44307               graph.parentWays(entity).length > 0;
44308       };
44309
44310
44311       operation.disabled = function () {
44312           var reason;
44313           if (some(selectedIDs, context.hasHiddenConnections)) {
44314               reason = 'connected_to_hidden';
44315           }
44316           return action.disabled(context.graph()) || reason;
44317       };
44318
44319
44320       operation.tooltip = function () {
44321           var disableReason = operation.disabled();
44322           if (disableReason) {
44323               return t('operations.detach_node.' + disableReason,
44324                   { relation: context.presets().item('type/restriction').name() });
44325           } else {
44326               return t('operations.detach_node.description');
44327           }
44328       };
44329
44330
44331       operation.annotation = function () {
44332           return t('operations.detach_node.annotation');
44333       };
44334
44335
44336       operation.id = 'detach-node';
44337       operation.keys = [t('operations.detach_node.key')];
44338       operation.title = t('operations.detach_node.title');
44339       operation.behavior = behaviorOperation(context).which(operation);
44340
44341
44342       return operation;
44343   }
44344
44345
44346
44347   var Operations = /*#__PURE__*/Object.freeze({
44348     operationCircularize: operationCircularize,
44349     operationContinue: operationContinue,
44350     operationDelete: operationDelete,
44351     operationDisconnect: operationDisconnect,
44352     operationMerge: operationMerge,
44353     operationMove: operationMove,
44354     operationOrthogonalize: operationOrthogonalize,
44355     operationReflectShort: operationReflectShort,
44356     operationReflectLong: operationReflectLong,
44357     operationReverse: operationReverse,
44358     operationRotate: operationRotate,
44359     operationSplit: operationSplit,
44360     operationStraighten: operationStraighten,
44361     operationDetachNode: operationDetachNode
44362   });
44363
44364   function validationDisconnectedWay() {
44365       var type = 'disconnected_way';
44366
44367
44368       function isDisconnectedHighway(entity, graph) {
44369           if (!entity.tags.highway) return false;
44370           if (entity.geometry(graph) !== 'line') return false;
44371
44372           return graph.childNodes(entity)
44373               .every(function(vertex) {
44374                   var parents = graph.parentWays(vertex);
44375                   if (parents.length === 1) {  // standalone vertex
44376                       return true;
44377                   } else {                     // shared vertex
44378                       return !vertex.tags.entrance &&
44379                           parents.filter(function(parent) {
44380                               return parent.tags.highway && parent !== entity;
44381                           }).length === 0;
44382                   }
44383               });
44384       }
44385
44386
44387       var validation = function(entity, context) {
44388           var issues = [];
44389           var graph = context.graph();
44390
44391           if (isDisconnectedHighway(entity, graph)) {
44392               var entityLabel = utilDisplayLabel(entity, context);
44393               var fixes = [];
44394
44395               if (!entity.isClosed()) {
44396                   var first = context.entity(entity.first());
44397                   if (first.tags.noexit !== 'yes') {
44398                       fixes.push(new validationIssueFix({
44399                           icon: 'iD-operation-continue-left',
44400                           title: t('issues.fix.continue_from_start.title'),
44401                           entityIds: [entity.first()],
44402                           onClick: function() {
44403                               var vertex = context.entity(entity.first());
44404                               continueDrawing(entity, vertex, context);
44405                           }
44406                       }));
44407                   }
44408                   var last = context.entity(entity.last());
44409                   if (last.tags.noexit !== 'yes') {
44410                       fixes.push(new validationIssueFix({
44411                           icon: 'iD-operation-continue',
44412                           title: t('issues.fix.continue_from_end.title'),
44413                           entityIds: [entity.last()],
44414                           onClick: function() {
44415                               var vertex = context.entity(entity.last());
44416                               continueDrawing(entity, vertex, context);
44417                           }
44418                       }));
44419                   }
44420               }
44421
44422               fixes.push(new validationIssueFix({
44423                   icon: 'iD-operation-delete',
44424                   title: t('issues.fix.delete_feature.title'),
44425                   entityIds: [entity.id],
44426                   onClick: function() {
44427                       var id = this.issue.entities[0].id;
44428                       operationDelete([id], context)();
44429                   }
44430               }));
44431
44432               issues.push(new validationIssue({
44433                   type: type,
44434                   severity: 'warning',
44435                   message: t('issues.disconnected_way.highway.message', { highway: entityLabel }),
44436                   tooltip: t('issues.disconnected_way.highway.tip'),
44437                   entities: [entity],
44438                   fixes: fixes
44439               }));
44440           }
44441
44442           return issues;
44443
44444
44445           function continueDrawing(way, vertex) {
44446               // make sure the vertex is actually visible and editable
44447               var map = context.map();
44448               if (!map.editable() || !map.trimmedExtent().contains(vertex.loc)) {
44449                   map.zoomToEase(vertex);
44450               }
44451
44452               context.enter(
44453                   modeDrawLine(context, way.id, context.graph(), context.graph(), way.affix(vertex.id), true)
44454               );
44455           }
44456       };
44457
44458
44459       validation.type = type;
44460
44461       return validation;
44462   }
44463
44464   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$","^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$","^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$","^obuwie$","^(okręgowa\\s)?stacja kontroli pojazdów$","^oplaadpunt$","^opti(c|k)a$","^optical center$","^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\\)","^דלק$","^カフェ$","^ポスト$","^珈琲館$","^加油站$","^郵局$","^食堂$","^(自動販売機|自販機)$","^体育館$"];
44465
44466   function validationGenericName() {
44467       var type = 'generic_name';
44468
44469       // known list of generic names (e.g. "bar")
44470       var discardNamesRegexes = discardNames.map(function(discardName) {
44471           return new RegExp(discardName, 'i');
44472       });
44473
44474       var keysToTestForGenericValues = ['amenity', 'building', 'leisure', 'man_made', 'shop', 'tourism'];
44475
44476       function isGenericName(entity) {
44477           var name = entity.tags.name;
44478           if (!name) return false;
44479           name = name.toLowerCase();
44480
44481           var i, key, val;
44482
44483           // test if the name is just the key or tag value (e.g. "park")
44484           for (i = 0; i < keysToTestForGenericValues.length; i++) {
44485               key = keysToTestForGenericValues[i];
44486               val = entity.tags[key];
44487               if (val) {
44488                   val = val.toLowerCase();
44489                   if (key === name ||
44490                       val === name ||
44491                       key.replace(/\_/g, ' ') === name ||
44492                       val.replace(/\_/g, ' ') === name) {
44493                       return entity.tags.name;
44494                   }
44495               }
44496           }
44497
44498           // test if the name is otherwise generic
44499           for (i = 0; i < discardNamesRegexes.length; i++) {
44500               if (discardNamesRegexes[i].test(name)) {
44501                   return entity.tags.name;
44502               }
44503           }
44504
44505           return false;
44506       }
44507
44508
44509       var validation = function(entity, context) {
44510           var issues = [];
44511           var generic = isGenericName(entity);
44512           if (generic) {
44513               var preset = utilPreset(entity, context);
44514               issues.push(new validationIssue({
44515                   type: type,
44516                   severity: 'warning',
44517                   message: t('issues.generic_name.message', {feature: preset.name(), name: generic}),
44518                   tooltip: t('issues.generic_name.tip'),
44519                   entities: [entity],
44520                   fixes: [
44521                       new validationIssueFix({
44522                           icon: 'iD-operation-delete',
44523                           title: t('issues.fix.remove_generic_name.title'),
44524                           onClick: function() {
44525                               var entity = this.issue.entities[0];
44526                               var tags = clone(entity.tags);
44527                               delete tags.name;
44528                               context.perform(
44529                                   actionChangeTags(entity.id, tags),
44530                                   t('issues.fix.remove_generic_name.annotation')
44531                               );
44532                           }
44533                       })
44534                   ]
44535               }));
44536           }
44537
44538           return issues;
44539       };
44540
44541       validation.type = type;
44542
44543       return validation;
44544   }
44545
44546   function validationManyDeletions() {
44547       var totalOtherGeomThreshold = 50;
44548       var relationThreshold = 10;   // relations are less common so use a lower threshold
44549
44550       var type = 'many_deletions';
44551
44552       var validation = function(changes, context) {
44553           var issues = [];
44554           var points = 0, lines = 0, areas = 0, relations = 0;
44555           var base = context.history().base();
44556           var geometry;
44557
44558           changes.deleted.forEach(function(entity) {
44559               if (entity.type === 'node' && entity.geometry(base) === 'point') {
44560                   points++;
44561               } else if (entity.type === 'way') {
44562                   geometry = entity.geometry(base);
44563                   if (geometry === 'line') {
44564                       lines++;
44565                   } else if (geometry === 'area') {
44566                        areas++;
44567                   }
44568               } else if (entity.type === 'relation') {
44569                   relations++;
44570               }
44571           });
44572
44573           if (points + lines + areas >= totalOtherGeomThreshold || relations >= relationThreshold) {
44574               var totalFeatures = points + lines + areas + relations;
44575
44576               var messageType = 'points-lines-areas';
44577               if (relations > 0) {
44578                   messageType += '-relations';
44579               }
44580               issues.push(new validationIssue({
44581                   type: type,
44582                   severity: 'warning',
44583                   message: t(
44584                       'issues.many_deletions.'+messageType+'.message',
44585                       { n: totalFeatures, p: points, l: lines, a:areas, r: relations }
44586                   ),
44587                   tooltip: t('issues.many_deletions.tip'),
44588                   hash: [points, lines, areas, relations].join()
44589               }));
44590           }
44591
44592           return issues;
44593       };
44594
44595       validation.type = type;
44596       validation.inputType = 'changes';
44597
44598       return validation;
44599   }
44600
44601   function validationMaprules() {
44602       var type = 'maprules';
44603
44604
44605       var validation = function(entity, context) {
44606           if (!services.maprules) return [];
44607
44608           var graph = context.graph();
44609
44610           var rules = services.maprules.validationRules();
44611           var issues = [];
44612
44613           for (var i = 0; i < rules.length; i++) {
44614               var rule = rules[i];
44615               rule.findIssues(entity, graph, issues);
44616           }
44617
44618           return issues;
44619       };
44620
44621
44622       validation.type = type;
44623
44624
44625       return validation;
44626   }
44627
44628   function validationMissingTag() {
44629       var type = 'missing_tag';
44630
44631
44632       function hasDescriptiveTags(entity) {
44633           var keys = without(Object.keys(entity.tags), 'area', 'name').filter(osmIsInterestingTag);
44634           if (entity.type === 'relation' && keys.length === 1) {
44635               return entity.tags.type !== 'multipolygon';
44636           }
44637           return keys.length > 0;
44638       }
44639
44640
44641       var validation = function(entity, context) {
44642           var graph = context.graph();
44643
44644           // ignore vertex features and relation members
44645           if (entity.geometry(graph) === 'vertex' || entity.hasParentRelations(graph)) {
44646               return [];
44647           }
44648
44649           var messageObj = {};
44650           var missingTagType;
44651
44652           if (isEmpty(entity.tags)) {
44653               missingTagType = 'any';
44654           } else if (!hasDescriptiveTags(entity)) {
44655               missingTagType = 'descriptive';
44656           } else if (entity.type === 'relation' && !entity.tags.type) {
44657               missingTagType = 'specific';
44658               messageObj.tag = 'type';
44659           }
44660
44661           if (!missingTagType) {
44662               return [];
44663           }
44664
44665           messageObj.feature = utilDisplayLabel(entity, context);
44666
44667           var issues = [];
44668
44669           var deleteFixOnClick = function() {
44670               var id = this.issue.entities[0].id;
44671               operationDelete([id], context)();
44672           };
44673           var canDelete = true;
44674           
44675           if (entity.type === 'relation' &&
44676               !entity.members.every(function(member) { return context.hasEntity(member.id); })) {
44677               deleteFixOnClick = null;
44678               canDelete = false;
44679           }
44680
44681           issues.push(new validationIssue({
44682               type: type,
44683               // error if created or modified and is deletable, else warning
44684               severity: (!entity.version || entity.v) && canDelete  ? 'error' : 'warning',
44685               message: t('issues.missing_tag.' + missingTagType + '.message', messageObj),
44686               tooltip: t('issues.missing_tag.tip'),
44687               entities: [entity],
44688               fixes: [
44689                   new validationIssueFix({
44690                       icon: 'iD-icon-search',
44691                       title: t('issues.fix.select_preset.title'),
44692                       onClick: function() {
44693                           context.ui().sidebar.showPresetList();
44694                       }
44695                   }),
44696                   new validationIssueFix({
44697                       icon: 'iD-operation-delete',
44698                       title: t('issues.fix.delete_feature.title'),
44699                       onClick: deleteFixOnClick
44700                   })
44701               ]
44702           }));
44703
44704           return issues;
44705       };
44706
44707       validation.type = type;
44708
44709       return validation;
44710   }
44711
44712   function validationOldMultipolygon() {
44713       var type = 'old_multipolygon';
44714
44715
44716       var validation = function(entity, context) {
44717           var issues = [];
44718           var graph = context.graph();
44719
44720           var multipolygon, outerWay;
44721           if (entity.type === 'relation') {
44722               outerWay = osmOldMultipolygonOuterMemberOfRelation(entity, graph);
44723               multipolygon = entity;
44724           } else if (entity.type === 'way') {
44725               multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
44726               outerWay = entity;
44727           } else {
44728               return issues;
44729           }
44730
44731           if (multipolygon && outerWay) {
44732               var multipolygonLabel = utilDisplayLabel(multipolygon, context);
44733               issues.push(new validationIssue({
44734                   type: type,
44735                   severity: 'warning',
44736                   message: t('issues.old_multipolygon.message', { multipolygon: multipolygonLabel }),
44737                   tooltip: t('issues.old_multipolygon.tip'),
44738                   entities: [outerWay, multipolygon],
44739                   fixes: [
44740                       new validationIssueFix({
44741                           title: t('issues.fix.move_tags.title'),
44742                           onClick: function() {
44743                               var outerWay = this.issue.entities[0];
44744                               var multipolygon =  this.issue.entities[1];
44745                               context.perform(
44746                                   function(graph) {
44747                                       multipolygon = multipolygon.mergeTags(outerWay.tags);
44748                                       graph = graph.replace(multipolygon);
44749                                       graph = actionChangeTags(outerWay.id, {})(graph);
44750                                       return graph;
44751                                   },
44752                                   t('issues.fix.move_tags.annotation')
44753                               );
44754                           }
44755                       })
44756                   ]
44757               }));
44758           }
44759           return issues;
44760       };
44761
44762       validation.type = type;
44763
44764       return validation;
44765   }
44766
44767   function validationTagSuggestsArea() {
44768       var type = 'tag_suggests_area';
44769
44770
44771       var validation = function(entity, context) {
44772           if (entity.type !== 'way') return [];
44773
44774           var issues = [];
44775           var graph = context.graph();
44776           var tagSuggestingArea = entity.tagSuggestingArea();
44777           var tagSuggestsArea = !entity.isClosed() && tagSuggestingArea;
44778
44779           if (tagSuggestsArea) {
44780               var tagText = utilTagText({ tags: tagSuggestingArea });
44781               var fixes = [];
44782
44783               var connectEndpointsOnClick;
44784
44785               // must have at least three nodes to close this automatically
44786               if (entity.nodes.length >= 3) {
44787                   var nodes = graph.childNodes(entity), testNodes;
44788                   var firstToLastDistanceMeters = geoSphericalDistance(nodes[0].loc, nodes[nodes.length-1].loc);
44789
44790                   // if the distance is very small, attempt to merge the endpoints
44791                   if (firstToLastDistanceMeters < 0.75) {
44792                       testNodes = clone(nodes);
44793                       testNodes.pop();
44794                       testNodes.push(testNodes[0]);
44795                       // make sure this will not create a self-intersection
44796                       if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
44797                           connectEndpointsOnClick = function() {
44798                               var way = this.issue.entities[0];
44799                               context.perform(
44800                                   actionMergeNodes([way.nodes[0], way.nodes[way.nodes.length-1]], nodes[0].loc),
44801                                   t('issues.fix.connect_endpoints.annotation')
44802                               );
44803                           };
44804                       }
44805                   }
44806
44807                   if (!connectEndpointsOnClick) {
44808                       // if the points were not merged, attempt to close the way
44809                       testNodes = clone(nodes);
44810                       testNodes.push(testNodes[0]);
44811                       // make sure this will not create a self-intersection
44812                       if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
44813                           connectEndpointsOnClick = function() {
44814                               var way = this.issue.entities[0];
44815                               var nodeId = way.nodes[0];
44816                               var index = way.nodes.length;
44817                               context.perform(
44818                                   actionAddVertex(way.id, nodeId, index),
44819                                   t('issues.fix.connect_endpoints.annotation')
44820                               );
44821                           };
44822                       }
44823                   }
44824               }
44825
44826               fixes.push(new validationIssueFix({
44827                   title: t('issues.fix.connect_endpoints.title'),
44828                   onClick: connectEndpointsOnClick
44829               }));
44830
44831               fixes.push(new validationIssueFix({
44832                   icon: 'iD-operation-delete',
44833                   title: t('issues.fix.remove_tag.title'),
44834                   onClick: function() {
44835                       var entity = this.issue.entities[0];
44836                       var tags = clone(entity.tags);
44837                       for (var key in tagSuggestingArea) {
44838                           delete tags[key];
44839                       }
44840                       context.perform(
44841                           actionChangeTags(entity.id, tags),
44842                           t('issues.fix.remove_tag.annotation')
44843                       );
44844                   }
44845               }));
44846
44847               var featureLabel = utilDisplayLabel(entity, context);
44848               issues.push(new validationIssue({
44849                   type: type,
44850                   severity: 'warning',
44851                   message: t('issues.tag_suggests_area.message', { feature: featureLabel, tag: tagText }),
44852                   tooltip: t('issues.tag_suggests_area.tip'),
44853                   entities: [entity],
44854                   fixes: fixes
44855               }));
44856           }
44857
44858           return issues;
44859       };
44860
44861       validation.type = type;
44862
44863       return validation;
44864   }
44865
44866
44867
44868   var Validations = /*#__PURE__*/Object.freeze({
44869     validationAlmostJunction: validationAlmostJunction,
44870     validationCrossingWays: validationCrossingWays,
44871     validationDeprecatedTag: validationDeprecatedTag,
44872     validationDisconnectedWay: validationDisconnectedWay,
44873     validationGenericName: validationGenericName,
44874     validationManyDeletions: validationManyDeletions,
44875     validationMaprules: validationMaprules,
44876     validationMissingTag: validationMissingTag,
44877     validationOldMultipolygon: validationOldMultipolygon,
44878     validationTagSuggestsArea: validationTagSuggestsArea
44879   });
44880
44881   function coreValidator(context) {
44882       var dispatch$1 = dispatch('reload');
44883       var self = {};
44884       var _issues = [];
44885       var _issuesByEntityID = {};
44886
44887       var validations = filter(Validations, isFunction).reduce(function(obj, validation) {
44888           var func = validation();
44889           obj[func.type] = func;
44890           return obj;
44891       }, {});
44892
44893       var entityValidationIDs = [];
44894       var changesValidationIDs = [];
44895
44896       for (var key in validations) {
44897           var validation = validations[key];
44898           if (validation.inputType && validation.inputType === 'changes') {
44899               changesValidationIDs.push(key);
44900           } else {
44901               entityValidationIDs.push(key);
44902           }
44903       }
44904
44905       //self.featureApplicabilityOptions = ['edited', 'all'];
44906
44907       /*var featureApplicability = context.storage('issue-features') || 'edited';
44908
44909       self.getFeatureApplicability = function() {
44910           return featureApplicability;
44911       };
44912
44913       self.setFeatureApplicability = function(applicability) {
44914           featureApplicability = applicability;
44915           context.storage('issue-features', applicability);
44916       };*/
44917
44918       self.getIssues = function() {
44919           return _issues;
44920       };
44921
44922       self.getWarnings = function() {
44923           return _issues.filter(function(d) { return d.severity === 'warning'; });
44924       };
44925
44926       self.getErrors = function() {
44927           return _issues.filter(function(d) { return d.severity === 'error'; });
44928       };
44929
44930       self.getIssuesForEntityWithID = function(entityID) {
44931           if (!context.hasEntity(entityID)) return [];
44932           var entity = context.entity(entityID);
44933           var key = osmEntity.key(entity);
44934
44935           if (!_issuesByEntityID[key]) {
44936               _issuesByEntityID[key] = validateEntity(entity);
44937           }
44938           return _issuesByEntityID[key];
44939       };
44940
44941
44942       function validateEntity(entity) {
44943           var _issues = [];
44944           var ran = {};
44945
44946           // runs validation and appends resulting issues, returning true if validation passed
44947           function runValidation(which) {
44948               if (ran[which]) return true;
44949
44950               var fn = validations[which];
44951               var typeIssues = fn(entity, context);
44952               _issues = _issues.concat(typeIssues);
44953               ran[which] = true;   // mark this validation as having run
44954               return !typeIssues.length;
44955           }
44956
44957           if (entity.type === 'relation') {
44958               if (!runValidation('old_multipolygon')) {
44959                   // don't flag missing tags if they are on the outer way
44960                   ran.missing_tag = true;
44961               }
44962           }
44963
44964           // other validations require feature to be tagged
44965           if (!runValidation('missing_tag')) return _issues;
44966
44967           if (entity.type === 'way') {
44968               runValidation('crossing_ways');
44969
44970               // only check for disconnected way if no almost junctions
44971               if (runValidation('almost_junction')) {
44972                   runValidation('disconnected_way');
44973               } else {
44974                   ran.disconnected_way = true;
44975               }
44976
44977               runValidation('tag_suggests_area');
44978           }
44979
44980           // run all validations not yet run manually
44981           entityValidationIDs.forEach(runValidation);
44982
44983           return _issues;
44984       }
44985
44986
44987       self.validate = function() {
44988           _issuesByEntityID = {};   // clear cached
44989           _issues = [];
44990
44991           var history = context.history();
44992           var changes = history.changes();
44993           var entitiesToCheck = changes.created.concat(changes.modified);
44994           var graph = history.graph();
44995
44996           _issues = flatten(map$3(changesValidationIDs, function(ruleID) {
44997               var validation = validations[ruleID];
44998               return validation(changes, context);
44999           }));
45000
45001           entitiesToCheck = uniq(flattenDeep(map$3(entitiesToCheck, function(entity) {
45002               var entities = [entity];
45003               if (entity.type === 'node') {  // validate ways if their nodes have changed
45004                   entities = entities.concat(graph.parentWays(entity));
45005               }
45006               entities = map$3(entities, function(entity) {
45007                   if (entity.type !== 'relation') {  // validate relations if their geometries have changed
45008                       return [entity].concat(graph.parentRelations(entity));
45009                   }
45010                   return entity;
45011               });
45012               return entities;
45013           })));
45014
45015           for (var entityIndex in entitiesToCheck) {
45016               var entity = entitiesToCheck[entityIndex];
45017               var entityIssues = validateEntity(entity);
45018               _issuesByEntityID[entity.id] = entityIssues;
45019               _issues = _issues.concat(entityIssues);
45020           }
45021
45022           _issues = uniqWith(_issues, function(issue1, issue2) {
45023               return issue1.id() === issue2.id();
45024           });
45025
45026           dispatch$1.call('reload', self, _issues);
45027       };
45028
45029       return utilRebind(self, dispatch$1, 'on');
45030   }
45031
45032
45033   function validationIssue(attrs) {
45034       this.type = attrs.type;                // required
45035       this.severity = attrs.severity;        // required - 'warning' or 'error'
45036       this.message = attrs.message;          // required - localized string
45037       this.tooltip = attrs.tooltip;          // required - localized string
45038       this.entities = attrs.entities;        // optional - array of entities
45039       this.loc = attrs.loc;                  // optional - expect a [lon, lat] array
45040       this.info = attrs.info;                // optional - object containing arbitrary extra information
45041       this.fixes = attrs.fixes;              // optional - array of validationIssueFix objects
45042       this.hash = attrs.hash;                // optional - string to further differentiate the issue
45043
45044       // A unique, deterministic string hash.
45045       // Issues with identical id values are considered identical.
45046       this.id = function() {
45047           var id = this.type;
45048
45049           if (this.hash) {   // subclasses can pass in their own differentiator
45050               id += this.hash;
45051           }
45052
45053           // factor in the entities this issue is for
45054           // (sort them so the id is deterministic)
45055           var entityKeys = this.entities.map(osmEntity.key);
45056           id += entityKeys.sort().join();
45057
45058           // factor in loc since two separate issues can have an
45059           // idential type and entities, e.g. in crossing_ways
45060           if (this.loc) {
45061               id += this.loc.join();
45062           }
45063           return id;
45064       };
45065
45066
45067       this.extent = function(resolver) {
45068           if (this.loc) {
45069               return geoExtent(this.loc);
45070           }
45071           if (this.entities && this.entities.length) {
45072               return this.entities.reduce(function(extent, entity) {
45073                   return extent.extend(entity.extent(resolver));
45074               }, geoExtent());
45075           }
45076           return null;
45077       };
45078
45079
45080       if (this.fixes) {   // add a reference in the fixes to the issue for use in fix actions
45081           for (var i = 0; i < this.fixes.length; i++) {
45082               this.fixes[i].issue = this;
45083           }
45084       }
45085   }
45086
45087
45088   function validationIssueFix(attrs) {
45089       this.icon = attrs.icon;
45090       this.title = attrs.title;
45091       this.onClick = attrs.onClick;
45092       this.entityIds = attrs.entityIds || [];  // Used for hover-higlighting.
45093       this.issue = null;    // the issue this fix is for
45094   }
45095
45096   var buildRuleChecks = function() {
45097       return {
45098           equals: function (equals) {
45099               return function(tags) {
45100                   return isMatch(tags, equals);
45101               };
45102           },
45103           notEquals: function (notEquals) {
45104               return function(tags) {
45105                   return !isMatch(tags, notEquals);
45106               };
45107           },
45108           absence: function(absence) {
45109               return function(tags) {
45110                   return Object.keys(tags).indexOf(absence) === -1;
45111               };
45112           },
45113           presence: function(presence) {
45114               return function(tags) {
45115                   return Object.keys(tags).indexOf(presence) > -1;
45116               };
45117           },
45118           greaterThan: function(greaterThan) {
45119               var key = Object.keys(greaterThan)[0];
45120               var value = greaterThan[key];
45121
45122               return function(tags) {
45123                   return tags[key] > value;
45124               };
45125           },
45126           greaterThanEqual: function(greaterThanEqual) {
45127               var key = Object.keys(greaterThanEqual)[0];
45128               var value = greaterThanEqual[key];
45129
45130               return function(tags) {
45131                   return tags[key] >= value;
45132               };
45133           },
45134           lessThan: function(lessThan) {
45135               var key = Object.keys(lessThan)[0];
45136               var value = lessThan[key];
45137
45138               return function(tags) {
45139                   return tags[key] < value;
45140               };
45141           },
45142           lessThanEqual: function(lessThanEqual) {
45143               var key = Object.keys(lessThanEqual)[0];
45144               var value = lessThanEqual[key];
45145
45146               return function(tags) {
45147                   return tags[key] <= value;
45148               };
45149           },
45150           positiveRegex: function(positiveRegex) {
45151               var tagKey = Object.keys(positiveRegex)[0];
45152               var expression = positiveRegex[tagKey].join('|');
45153               var regex = new RegExp(expression);
45154
45155               return function(tags) {
45156                   return regex.test(tags[tagKey]);
45157               };
45158           },
45159           negativeRegex: function(negativeRegex) {
45160               var tagKey = Object.keys(negativeRegex)[0];
45161               var expression = negativeRegex[tagKey].join('|');
45162               var regex = new RegExp(expression);
45163
45164               return function(tags) {
45165                   return !regex.test(tags[tagKey]);
45166               };
45167           }
45168       };
45169   };
45170
45171   var buildLineKeys = function() {
45172       return {
45173           highway: {
45174               rest_area: true,
45175               services: true
45176           },
45177           railway: {
45178               roundhouse: true,
45179               station: true,
45180               traverser: true,
45181               turntable: true,
45182               wash: true
45183           }
45184       };
45185   };
45186
45187   var serviceMapRules = {
45188       init: function() {
45189           this._ruleChecks  = buildRuleChecks();
45190           this._validationRules = [];
45191           this._areaKeys = areaKeys;
45192           this._lineKeys = buildLineKeys();
45193       },
45194
45195       // list of rules only relevant to tag checks...
45196       filterRuleChecks: function(selector) {
45197           var _ruleChecks = this._ruleChecks;
45198           return reduce(Object.keys(selector), function(rules, key) {
45199               if (['geometry', 'error', 'warning'].indexOf(key) === -1) {
45200                   rules.push(_ruleChecks[key](selector[key]));
45201               }
45202               return rules;
45203           }, []);
45204       },
45205
45206       // builds tagMap from mapcss-parse selector object...
45207       buildTagMap: function(selector) {
45208           var getRegexValues = function(regexes) {
45209               return regexes.map(function(regex) {
45210                   return regex.replace(/\$|\^/g, '');
45211               });
45212           };
45213
45214           var selectorKeys = Object.keys(selector);
45215           var tagMap = reduce(selectorKeys, function (expectedTags, key) {
45216               var values;
45217               var isRegex = /regex/gi.test(key);
45218               var isEqual = /equals/gi.test(key);
45219
45220               if (isRegex || isEqual) {
45221                   Object.keys(selector[key]).forEach(function(selectorKey) {
45222                       values = isEqual ? [selector[key][selectorKey]] : getRegexValues(selector[key][selectorKey]);
45223
45224                       if (expectedTags.hasOwnProperty(selectorKey)) {
45225                           values = values.concat(expectedTags[selectorKey]);
45226                       }
45227
45228                       expectedTags[selectorKey] = values;
45229                   });
45230
45231               } else if (/(greater|less)Than(Equal)?|presence/g.test(key)) {
45232                   var tagKey = /presence/.test(key) ? selector[key] : Object.keys(selector[key])[0];
45233
45234                   values = [selector[key][tagKey]];
45235
45236                   if (expectedTags.hasOwnProperty(tagKey)) {
45237                       values = values.concat(expectedTags[tagKey]);
45238                   }
45239
45240                   expectedTags[tagKey] = values;
45241               }
45242
45243               return expectedTags;
45244           }, {});
45245
45246           return tagMap;
45247       },
45248
45249       // inspired by osmWay#isArea()
45250       inferGeometry: function(tagMap) {
45251           var _lineKeys = this._lineKeys;
45252           var _areaKeys = this._areaKeys;
45253
45254           var isAreaKeyBlackList = function(key) {
45255               return intersection(tagMap[key], Object.keys(_areaKeys[key])).length > 0;
45256           };
45257           var isLineKeysWhiteList = function(key) {
45258               return intersection(tagMap[key], Object.keys(_lineKeys[key])).length > 0;
45259           };
45260
45261           if (tagMap.hasOwnProperty('area')) {
45262               if (tagMap.area.indexOf('yes') > -1) {
45263                   return 'area';
45264               }
45265               if (tagMap.area.indexOf('no') > -1) {
45266                   return 'line';
45267               }
45268           }
45269
45270           for (var key in tagMap) {
45271               if (key in _areaKeys && !isAreaKeyBlackList(key)) {
45272                   return 'area';
45273               }
45274               if (key in _lineKeys && isLineKeysWhiteList(key)) {
45275                   return 'area';
45276               }
45277           }
45278
45279           return 'line';
45280       },
45281
45282       // adds from mapcss-parse selector check...
45283       addRule: function(selector) {
45284           var rule = {
45285               // checks relevant to mapcss-selector
45286               checks: this.filterRuleChecks(selector),
45287               // true if all conditions for a tag error are true..
45288               matches: function(entity) {
45289                   return every(this.checks, function(check) {
45290                       return check(entity.tags);
45291                   });
45292               },
45293               // borrowed from Way#isArea()
45294               inferredGeometry: this.inferGeometry(this.buildTagMap(selector), this._areaKeys),
45295               geometryMatches: function(entity, graph) {
45296                   if (entity.type === 'node' || entity.type === 'relation') {
45297                       return selector.geometry === entity.type;
45298                   } else if (entity.type === 'way') {
45299                       return this.inferredGeometry === entity.geometry(graph);
45300                   }
45301               },
45302               // when geometries match and tag matches are present, return a warning...
45303               findIssues: function (entity, graph, issues) {
45304                   if (this.geometryMatches(entity, graph) && this.matches(entity)) {
45305                       var severity = Object.keys(selector).indexOf('error') > -1
45306                               ? 'error'
45307                               : 'warning';
45308                       issues.push(new validationIssue({
45309                           type: 'maprules',
45310                           severity: severity,
45311                           message: selector[severity],
45312                           entities: [entity],
45313                       }));
45314                   }
45315               }
45316           };
45317           this._validationRules.push(rule);
45318       },
45319
45320       clearRules: function() { this._validationRules = []; },
45321
45322       // returns validationRules...
45323       validationRules: function() { return this._validationRules; },
45324
45325       // returns ruleChecks
45326       ruleChecks: function() { return this._ruleChecks; }
45327   };
45328
45329   var apibase$1 = 'https://nominatim.openstreetmap.org/',
45330       inflight = {},
45331       nominatimCache;
45332
45333
45334   var serviceNominatim = {
45335
45336       init: function() {
45337           inflight = {};
45338           nominatimCache = rbush_1();
45339       },
45340
45341       reset: function() {
45342           forEach(inflight, function(req) { req.abort(); });
45343           inflight = {};
45344           nominatimCache = rbush_1();
45345       },
45346
45347
45348       countryCode: function (location, callback) {
45349           this.reverse(location, function(err, result) {
45350               if (err) {
45351                   return callback(err);
45352               } else if (result.address) {
45353                   return callback(null, result.address.country_code);
45354               } else {
45355                   return callback('Unable to geocode', null);
45356               }
45357           });
45358       },
45359
45360
45361       reverse: function (location, callback) {
45362           var cached = nominatimCache.search(
45363               { minX: location[0], minY: location[1], maxX: location[0], maxY: location[1] }
45364           );
45365
45366           if (cached.length > 0) {
45367               return callback(null, cached[0].data);
45368           }
45369
45370           var params = { zoom: 13, format: 'json', addressdetails: 1, lat: location[1], lon: location[0] };
45371           var url = apibase$1 + 'reverse?' + utilQsString(params);
45372           if (inflight[url]) return;
45373
45374           inflight[url] = d3_json(url, function(err, result) {
45375               delete inflight[url];
45376
45377               if (err) {
45378                   return callback(err);
45379               } else if (result && result.error) {
45380                   return callback(result.error);
45381               }
45382
45383               var extent = geoExtent(location).padByMeters(200);
45384               nominatimCache.insert(assign(extent.bbox(), {data: result}));
45385
45386               callback(null, result);
45387           });
45388       },
45389
45390
45391       search: function (val, callback) {
45392           var searchVal = encodeURIComponent(val);
45393           var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
45394           if (inflight[url]) return;
45395
45396           inflight[url] = d3_json(url, function(err, result) {
45397               delete inflight[url];
45398               callback(err, result);
45399           });
45400       }
45401
45402   };
45403
45404   var apibase$2 = 'https://openstreetcam.org';
45405   var maxResults$1 = 1000;
45406   var tileZoom$1 = 14;
45407   var tiler$3 = utilTiler().zoomExtent([tileZoom$1, tileZoom$1]).skipNullIsland(true);
45408   var dispatch$4 = dispatch('loadedImages');
45409   var imgZoom = d3_zoom()
45410       .extent([[0, 0], [320, 240]])
45411       .translateExtent([[0, 0], [320, 240]])
45412       .scaleExtent([1, 15])
45413       .on('zoom', zoomPan);
45414   var _oscCache;
45415   var _oscSelectedImage;
45416
45417
45418   function abortRequest$3(i) {
45419       i.abort();
45420   }
45421
45422
45423   function maxPageAtZoom$1(z) {
45424       if (z < 15)   return 2;
45425       if (z === 15) return 5;
45426       if (z === 16) return 10;
45427       if (z === 17) return 20;
45428       if (z === 18) return 40;
45429       if (z > 18)   return 80;
45430   }
45431
45432
45433   function loadTiles$1(which, url, projection) {
45434       var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
45435       var tiles = tiler$3.getTiles(projection);
45436
45437       // abort inflight requests that are no longer needed
45438       var cache = _oscCache[which];
45439       forEach(cache.inflight, function(v, k) {
45440           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
45441
45442           if (!wanted) {
45443               abortRequest$3(v);
45444               delete cache.inflight[k];
45445           }
45446       });
45447
45448       tiles.forEach(function(tile) {
45449           loadNextTilePage$1(which, currZoom, url, tile);
45450       });
45451   }
45452
45453
45454   function loadNextTilePage$1(which, currZoom, url, tile) {
45455       var cache = _oscCache[which];
45456       var bbox = tile.extent.bbox();
45457       var maxPages = maxPageAtZoom$1(currZoom);
45458       var nextPage = cache.nextPage[tile.id] || 1;
45459       var params = utilQsString({
45460           ipp: maxResults$1,
45461           page: nextPage,
45462           // client_id: clientId,
45463           bbTopLeft: [bbox.maxY, bbox.minX].join(','),
45464           bbBottomRight: [bbox.minY, bbox.maxX].join(',')
45465       }, true);
45466
45467       if (nextPage > maxPages) return;
45468
45469       var id = tile.id + ',' + String(nextPage);
45470       if (cache.loaded[id] || cache.inflight[id]) return;
45471
45472       cache.inflight[id] = request(url)
45473           .mimeType('application/json')
45474           .header('Content-type', 'application/x-www-form-urlencoded')
45475           .response(function(xhr) { return JSON.parse(xhr.responseText); })
45476           .post(params, function(err, data) {
45477               cache.loaded[id] = true;
45478               delete cache.inflight[id];
45479               if (err || !data.currentPageItems || !data.currentPageItems.length) return;
45480
45481               function localeDateString(s) {
45482                   if (!s) return null;
45483                   var detected = utilDetect();
45484                   var options = { day: 'numeric', month: 'short', year: 'numeric' };
45485                   var d = new Date(s);
45486                   if (isNaN(d.getTime())) return null;
45487                   return d.toLocaleDateString(detected.locale, options);
45488               }
45489
45490               var features = data.currentPageItems.map(function(item) {
45491                   var loc = [+item.lng, +item.lat];
45492                   var d;
45493
45494                   if (which === 'images') {
45495                       d = {
45496                           loc: loc,
45497                           key: item.id,
45498                           ca: +item.heading,
45499                           captured_at: localeDateString(item.shot_date || item.date_added),
45500                           captured_by: item.username,
45501                           imagePath: item.lth_name,
45502                           sequence_id: item.sequence_id,
45503                           sequence_index: +item.sequence_index
45504                       };
45505
45506                       // cache sequence info
45507                       var seq = _oscCache.sequences[d.sequence_id];
45508                       if (!seq) {
45509                           seq = { rotation: 0, images: [] };
45510                           _oscCache.sequences[d.sequence_id] = seq;
45511                       }
45512                       seq.images[d.sequence_index] = d;
45513                   }
45514
45515                   return {
45516                       minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
45517                   };
45518               });
45519
45520               cache.rtree.load(features);
45521
45522               if (which === 'images') {
45523                   dispatch$4.call('loadedImages');
45524               }
45525
45526               if (data.currentPageItems.length === maxResults$1) {  // more pages to load
45527                   cache.nextPage[tile.id] = nextPage + 1;
45528                   loadNextTilePage$1(which, currZoom, url, tile);
45529               } else {
45530                   cache.nextPage[tile.id] = Infinity;     // no more pages to load
45531               }
45532           });
45533   }
45534
45535
45536   // partition viewport into higher zoom tiles
45537   function partitionViewport$1(projection) {
45538       var z = geoScaleToZoom(projection.scale());
45539       var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
45540       var tiler = utilTiler().zoomExtent([z2, z2]);
45541
45542       return tiler.getTiles(projection)
45543           .map(function(tile) { return tile.extent; });
45544   }
45545
45546
45547   // no more than `limit` results per partition.
45548   function searchLimited$1(limit, projection, rtree) {
45549       limit = limit || 5;
45550
45551       return partitionViewport$1(projection)
45552           .reduce(function(result, extent) {
45553               var found = rtree.search(extent.bbox())
45554                   .slice(0, limit)
45555                   .map(function(d) { return d.data; });
45556
45557               return (found.length ? result.concat(found) : result);
45558           }, []);
45559   }
45560
45561
45562   function zoomPan() {
45563       var t = event.transform;
45564       select('#photoviewer .osc-image-wrap')
45565           .call(utilSetTransform, t.x, t.y, t.k);
45566   }
45567
45568
45569   var serviceOpenstreetcam = {
45570
45571       init: function() {
45572           if (!_oscCache) {
45573               this.reset();
45574           }
45575
45576           this.event = utilRebind(this, dispatch$4, 'on');
45577       },
45578
45579       reset: function() {
45580           var cache = _oscCache;
45581
45582           if (cache) {
45583               if (cache.images && cache.images.inflight) {
45584                   forEach(cache.images.inflight, abortRequest$3);
45585               }
45586           }
45587
45588           _oscCache = {
45589               images: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1() },
45590               sequences: {}
45591           };
45592
45593           _oscSelectedImage = null;
45594       },
45595
45596
45597       images: function(projection) {
45598           var limit = 5;
45599           return searchLimited$1(limit, projection, _oscCache.images.rtree);
45600       },
45601
45602
45603       sequences: function(projection) {
45604           var viewport = projection.clipExtent();
45605           var min = [viewport[0][0], viewport[1][1]];
45606           var max = [viewport[1][0], viewport[0][1]];
45607           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
45608           var sequenceKeys = {};
45609
45610           // all sequences for images in viewport
45611           _oscCache.images.rtree.search(bbox)
45612               .forEach(function(d) { sequenceKeys[d.data.sequence_id] = true; });
45613
45614           // make linestrings from those sequences
45615           var lineStrings = [];
45616           Object.keys(sequenceKeys)
45617               .forEach(function(sequenceKey) {
45618                   var seq = _oscCache.sequences[sequenceKey];
45619                   var images = seq && seq.images;
45620                   if (images) {
45621                       lineStrings.push({
45622                           type: 'LineString',
45623                           coordinates: images.map(function (d) { return d.loc; }).filter(Boolean),
45624                           properties: { key: sequenceKey }
45625                       });
45626                   }
45627               });
45628           return lineStrings;
45629       },
45630
45631
45632       loadImages: function(projection) {
45633           var url = apibase$2 + '/1.0/list/nearby-photos/';
45634           loadTiles$1('images', url, projection);
45635       },
45636
45637
45638       loadViewer: function(context) {
45639           var that = this;
45640
45641           // add osc-wrapper
45642           var wrap = select('#photoviewer').selectAll('.osc-wrapper')
45643               .data([0]);
45644
45645           var wrapEnter = wrap.enter()
45646               .append('div')
45647               .attr('class', 'photo-wrapper osc-wrapper')
45648               .classed('hide', true)
45649               .call(imgZoom)
45650               .on('dblclick.zoom', null);
45651
45652           wrapEnter
45653               .append('div')
45654               .attr('class', 'photo-attribution fillD');
45655
45656           var controlsEnter = wrapEnter
45657               .append('div')
45658               .attr('class', 'photo-controls-wrap')
45659               .append('div')
45660               .attr('class', 'photo-controls');
45661
45662           controlsEnter
45663               .append('button')
45664               .on('click.back', step(-1))
45665               .text('◄');
45666
45667           controlsEnter
45668               .append('button')
45669               .on('click.rotate-ccw', rotate(-90))
45670               .text('⤿');
45671
45672           controlsEnter
45673               .append('button')
45674               .on('click.rotate-cw', rotate(90))
45675               .text('⤾');
45676
45677           controlsEnter
45678               .append('button')
45679               .on('click.forward', step(1))
45680               .text('►');
45681
45682           wrapEnter
45683               .append('div')
45684               .attr('class', 'osc-image-wrap');
45685
45686
45687           // Register viewer resize handler
45688           context.ui().photoviewer.on('resize', function(dimensions) {
45689               imgZoom = d3_zoom()
45690                   .extent([[0, 0], dimensions])
45691                   .translateExtent([[0, 0], dimensions])
45692                   .scaleExtent([1, 15])
45693                   .on('zoom', zoomPan);
45694           });
45695
45696
45697           function rotate(deg) {
45698               return function() {
45699                   if (!_oscSelectedImage) return;
45700                   var sequenceKey = _oscSelectedImage.sequence_id;
45701                   var sequence = _oscCache.sequences[sequenceKey];
45702                   if (!sequence) return;
45703
45704                   var r = sequence.rotation || 0;
45705                   r += deg;
45706
45707                   if (r > 180) r -= 360;
45708                   if (r < -180) r += 360;
45709                   sequence.rotation = r;
45710
45711                   var wrap = select('#photoviewer .osc-wrapper');
45712
45713                   wrap
45714                       .transition()
45715                       .duration(100)
45716                       .call(imgZoom.transform, identity$7);
45717
45718                   wrap.selectAll('.osc-image')
45719                       .transition()
45720                       .duration(100)
45721                       .style('transform', 'rotate(' + r + 'deg)');
45722               };
45723           }
45724
45725           function step(stepBy) {
45726               return function() {
45727                   if (!_oscSelectedImage) return;
45728                   var sequenceKey = _oscSelectedImage.sequence_id;
45729                   var sequence = _oscCache.sequences[sequenceKey];
45730                   if (!sequence) return;
45731
45732                   var nextIndex = _oscSelectedImage.sequence_index + stepBy;
45733                   var nextImage = sequence.images[nextIndex];
45734                   if (!nextImage) return;
45735
45736                   context.map().centerEase(nextImage.loc);
45737
45738                   that
45739                       .selectImage(nextImage)
45740                       .updateViewer(nextImage);
45741               };
45742           }
45743       },
45744
45745
45746       showViewer: function() {
45747           var viewer = select('#photoviewer')
45748               .classed('hide', false);
45749
45750           var isHidden = viewer.selectAll('.photo-wrapper.osc-wrapper.hide').size();
45751
45752           if (isHidden) {
45753               viewer
45754                   .selectAll('.photo-wrapper:not(.osc-wrapper)')
45755                   .classed('hide', true);
45756
45757               viewer
45758                   .selectAll('.photo-wrapper.osc-wrapper')
45759                   .classed('hide', false);
45760           }
45761
45762           return this;
45763       },
45764
45765
45766       hideViewer: function() {
45767           _oscSelectedImage = null;
45768
45769           var viewer = select('#photoviewer');
45770           if (!viewer.empty()) viewer.datum(null);
45771
45772           viewer
45773               .classed('hide', true)
45774               .selectAll('.photo-wrapper')
45775               .classed('hide', true);
45776
45777           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
45778               .classed('currentView', false);
45779
45780           return this.setStyles(null, true);
45781       },
45782
45783
45784       updateViewer: function(d) {
45785           var wrap = select('#photoviewer .osc-wrapper');
45786           var imageWrap = wrap.selectAll('.osc-image-wrap');
45787           var attribution = wrap.selectAll('.photo-attribution').html('');
45788
45789           wrap
45790               .transition()
45791               .duration(100)
45792               .call(imgZoom.transform, identity$7);
45793
45794           imageWrap
45795               .selectAll('.osc-image')
45796               .remove();
45797
45798           if (d) {
45799               var sequence = _oscCache.sequences[d.sequence_id];
45800               var r = (sequence && sequence.rotation) || 0;
45801
45802               imageWrap
45803                   .append('img')
45804                   .attr('class', 'osc-image')
45805                   .attr('src', apibase$2 + '/' + d.imagePath)
45806                   .style('transform', 'rotate(' + r + 'deg)');
45807
45808               if (d.captured_by) {
45809                   attribution
45810                       .append('a')
45811                       .attr('class', 'captured_by')
45812                       .attr('target', '_blank')
45813                       .attr('href', 'https://openstreetcam.org/user/' + encodeURIComponent(d.captured_by))
45814                       .text('@' + d.captured_by);
45815
45816                   attribution
45817                       .append('span')
45818                       .text('|');
45819               }
45820
45821               if (d.captured_at) {
45822                   attribution
45823                       .append('span')
45824                       .attr('class', 'captured_at')
45825                       .text(d.captured_at);
45826
45827                   attribution
45828                       .append('span')
45829                       .text('|');
45830               }
45831
45832               attribution
45833                   .append('a')
45834                   .attr('class', 'image-link')
45835                   .attr('target', '_blank')
45836                   .attr('href', 'https://openstreetcam.org/details/' + d.sequence_id + '/' + d.sequence_index)
45837                   .text('openstreetcam.org');
45838           }
45839           return this;
45840       },
45841
45842
45843       selectImage: function(d) {
45844           _oscSelectedImage = d;
45845           var viewer = select('#photoviewer');
45846           if (!viewer.empty()) viewer.datum(d);
45847
45848           this.setStyles(null, true);
45849
45850           d3_selectAll('.icon-sign')
45851               .classed('currentView', false);
45852
45853           return this;
45854       },
45855
45856
45857       getSelectedImage: function() {
45858           return _oscSelectedImage;
45859       },
45860
45861
45862       getSequenceKeyForImage: function(d) {
45863           return d && d.sequence_id;
45864       },
45865
45866
45867       // Updates the currently highlighted sequence and selected bubble.
45868       // Reset is only necessary when interacting with the viewport because
45869       // this implicitly changes the currently selected bubble/sequence
45870       setStyles: function(hovered, reset) {
45871           if (reset) {  // reset all layers
45872               d3_selectAll('.viewfield-group')
45873                   .classed('highlighted', false)
45874                   .classed('hovered', false)
45875                   .classed('currentView', false);
45876
45877               d3_selectAll('.sequence')
45878                   .classed('highlighted', false)
45879                   .classed('currentView', false);
45880           }
45881
45882           var hoveredImageKey = hovered && hovered.key;
45883           var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
45884           var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
45885           var hoveredImageKeys = (hoveredSequence && hoveredSequence.images.map(function (d) { return d.key; })) || [];
45886
45887           var viewer = select('#photoviewer');
45888           var selected = viewer.empty() ? undefined : viewer.datum();
45889           var selectedImageKey = selected && selected.key;
45890           var selectedSequenceKey = this.getSequenceKeyForImage(selected);
45891           var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
45892           var selectedImageKeys = (selectedSequence && selectedSequence.images.map(function (d) { return d.key; })) || [];
45893
45894           // highlight sibling viewfields on either the selected or the hovered sequences
45895           var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
45896
45897           d3_selectAll('.layer-openstreetcam-images .viewfield-group')
45898               .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
45899               .classed('hovered', function(d) { return d.key === hoveredImageKey; })
45900               .classed('currentView', function(d) { return d.key === selectedImageKey; });
45901
45902           d3_selectAll('.layer-openstreetcam-images .sequence')
45903               .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
45904               .classed('currentView', function(d) { return d.properties.key === selectedSequenceKey; });
45905
45906           // update viewfields if needed
45907           d3_selectAll('.viewfield-group .viewfield')
45908               .attr('d', viewfieldPath);
45909
45910           function viewfieldPath() {
45911               var d = this.parentNode.__data__;
45912               if (d.pano && d.key !== selectedImageKey) {
45913                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
45914               } else {
45915                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
45916               }
45917           }
45918
45919           return this;
45920       },
45921
45922
45923       cache: function() {
45924           return _oscCache;
45925       }
45926
45927   };
45928
45929   /* Built-in method references for those with the same name as other `lodash` methods. */
45930   var nativeCeil = Math.ceil,
45931       nativeMax$4 = Math.max;
45932
45933   /**
45934    * Creates an array of elements split into groups the length of `size`.
45935    * If `array` can't be split evenly, the final chunk will be the remaining
45936    * elements.
45937    *
45938    * @static
45939    * @memberOf _
45940    * @since 3.0.0
45941    * @category Array
45942    * @param {Array} array The array to process.
45943    * @param {number} [size=1] The length of each chunk
45944    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
45945    * @returns {Array} Returns the new array of chunks.
45946    * @example
45947    *
45948    * _.chunk(['a', 'b', 'c', 'd'], 2);
45949    * // => [['a', 'b'], ['c', 'd']]
45950    *
45951    * _.chunk(['a', 'b', 'c', 'd'], 3);
45952    * // => [['a', 'b', 'c'], ['d']]
45953    */
45954   function chunk(array, size, guard) {
45955     if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
45956       size = 1;
45957     } else {
45958       size = nativeMax$4(toInteger(size), 0);
45959     }
45960     var length = array == null ? 0 : array.length;
45961     if (!length || size < 1) {
45962       return [];
45963     }
45964     var index = 0,
45965         resIndex = 0,
45966         result = Array(nativeCeil(length / size));
45967
45968     while (index < length) {
45969       result[resIndex++] = baseSlice(array, index, (index += size));
45970     }
45971     return result;
45972   }
45973
45974   var hashes = createCommonjsModule(function (module, exports) {
45975   /**
45976    * jshashes - https://github.com/h2non/jshashes
45977    * Released under the "New BSD" license
45978    *
45979    * Algorithms specification:
45980    *
45981    * MD5 - http://www.ietf.org/rfc/rfc1321.txt
45982    * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
45983    * SHA1   - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
45984    * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
45985    * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
45986    * HMAC - http://www.ietf.org/rfc/rfc2104.txt
45987    */
45988   (function() {
45989     var Hashes;
45990
45991     function utf8Encode(str) {
45992       var x, y, output = '',
45993         i = -1,
45994         l;
45995
45996       if (str && str.length) {
45997         l = str.length;
45998         while ((i += 1) < l) {
45999           /* Decode utf-16 surrogate pairs */
46000           x = str.charCodeAt(i);
46001           y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
46002           if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
46003             x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
46004             i += 1;
46005           }
46006           /* Encode output as utf-8 */
46007           if (x <= 0x7F) {
46008             output += String.fromCharCode(x);
46009           } else if (x <= 0x7FF) {
46010             output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
46011               0x80 | (x & 0x3F));
46012           } else if (x <= 0xFFFF) {
46013             output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
46014               0x80 | ((x >>> 6) & 0x3F),
46015               0x80 | (x & 0x3F));
46016           } else if (x <= 0x1FFFFF) {
46017             output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
46018               0x80 | ((x >>> 12) & 0x3F),
46019               0x80 | ((x >>> 6) & 0x3F),
46020               0x80 | (x & 0x3F));
46021           }
46022         }
46023       }
46024       return output;
46025     }
46026
46027     function utf8Decode(str) {
46028       var i, ac, c1, c2, c3, arr = [],
46029         l;
46030       i = ac = c1 = c2 = c3 = 0;
46031
46032       if (str && str.length) {
46033         l = str.length;
46034         str += '';
46035
46036         while (i < l) {
46037           c1 = str.charCodeAt(i);
46038           ac += 1;
46039           if (c1 < 128) {
46040             arr[ac] = String.fromCharCode(c1);
46041             i += 1;
46042           } else if (c1 > 191 && c1 < 224) {
46043             c2 = str.charCodeAt(i + 1);
46044             arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
46045             i += 2;
46046           } else {
46047             c2 = str.charCodeAt(i + 1);
46048             c3 = str.charCodeAt(i + 2);
46049             arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
46050             i += 3;
46051           }
46052         }
46053       }
46054       return arr.join('');
46055     }
46056
46057     /**
46058      * Add integers, wrapping at 2^32. This uses 16-bit operations internally
46059      * to work around bugs in some JS interpreters.
46060      */
46061
46062     function safe_add(x, y) {
46063       var lsw = (x & 0xFFFF) + (y & 0xFFFF),
46064         msw = (x >> 16) + (y >> 16) + (lsw >> 16);
46065       return (msw << 16) | (lsw & 0xFFFF);
46066     }
46067
46068     /**
46069      * Bitwise rotate a 32-bit number to the left.
46070      */
46071
46072     function bit_rol(num, cnt) {
46073       return (num << cnt) | (num >>> (32 - cnt));
46074     }
46075
46076     /**
46077      * Convert a raw string to a hex string
46078      */
46079
46080     function rstr2hex(input, hexcase) {
46081       var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
46082         output = '',
46083         x, i = 0,
46084         l = input.length;
46085       for (; i < l; i += 1) {
46086         x = input.charCodeAt(i);
46087         output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
46088       }
46089       return output;
46090     }
46091
46092     /**
46093      * Convert an array of big-endian words to a string
46094      */
46095
46096     function binb2rstr(input) {
46097       var i, l = input.length * 32,
46098         output = '';
46099       for (i = 0; i < l; i += 8) {
46100         output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
46101       }
46102       return output;
46103     }
46104
46105     /**
46106      * Convert an array of little-endian words to a string
46107      */
46108
46109     function binl2rstr(input) {
46110       var i, l = input.length * 32,
46111         output = '';
46112       for (i = 0; i < l; i += 8) {
46113         output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
46114       }
46115       return output;
46116     }
46117
46118     /**
46119      * Convert a raw string to an array of little-endian words
46120      * Characters >255 have their high-byte silently ignored.
46121      */
46122
46123     function rstr2binl(input) {
46124       var i, l = input.length * 8,
46125         output = Array(input.length >> 2),
46126         lo = output.length;
46127       for (i = 0; i < lo; i += 1) {
46128         output[i] = 0;
46129       }
46130       for (i = 0; i < l; i += 8) {
46131         output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
46132       }
46133       return output;
46134     }
46135
46136     /**
46137      * Convert a raw string to an array of big-endian words
46138      * Characters >255 have their high-byte silently ignored.
46139      */
46140
46141     function rstr2binb(input) {
46142       var i, l = input.length * 8,
46143         output = Array(input.length >> 2),
46144         lo = output.length;
46145       for (i = 0; i < lo; i += 1) {
46146         output[i] = 0;
46147       }
46148       for (i = 0; i < l; i += 8) {
46149         output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
46150       }
46151       return output;
46152     }
46153
46154     /**
46155      * Convert a raw string to an arbitrary string encoding
46156      */
46157
46158     function rstr2any(input, encoding) {
46159       var divisor = encoding.length,
46160         remainders = Array(),
46161         i, q, x, ld, quotient, dividend, output, full_length;
46162
46163       /* Convert to an array of 16-bit big-endian values, forming the dividend */
46164       dividend = Array(Math.ceil(input.length / 2));
46165       ld = dividend.length;
46166       for (i = 0; i < ld; i += 1) {
46167         dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
46168       }
46169
46170       /**
46171        * Repeatedly perform a long division. The binary array forms the dividend,
46172        * the length of the encoding is the divisor. Once computed, the quotient
46173        * forms the dividend for the next step. We stop when the dividend is zerHashes.
46174        * All remainders are stored for later use.
46175        */
46176       while (dividend.length > 0) {
46177         quotient = Array();
46178         x = 0;
46179         for (i = 0; i < dividend.length; i += 1) {
46180           x = (x << 16) + dividend[i];
46181           q = Math.floor(x / divisor);
46182           x -= q * divisor;
46183           if (quotient.length > 0 || q > 0) {
46184             quotient[quotient.length] = q;
46185           }
46186         }
46187         remainders[remainders.length] = x;
46188         dividend = quotient;
46189       }
46190
46191       /* Convert the remainders to the output string */
46192       output = '';
46193       for (i = remainders.length - 1; i >= 0; i--) {
46194         output += encoding.charAt(remainders[i]);
46195       }
46196
46197       /* Append leading zero equivalents */
46198       full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
46199       for (i = output.length; i < full_length; i += 1) {
46200         output = encoding[0] + output;
46201       }
46202       return output;
46203     }
46204
46205     /**
46206      * Convert a raw string to a base-64 string
46207      */
46208
46209     function rstr2b64(input, b64pad) {
46210       var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
46211         output = '',
46212         len = input.length,
46213         i, j, triplet;
46214       b64pad = b64pad || '=';
46215       for (i = 0; i < len; i += 3) {
46216         triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
46217         for (j = 0; j < 4; j += 1) {
46218           if (i * 8 + j * 6 > input.length * 8) {
46219             output += b64pad;
46220           } else {
46221             output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
46222           }
46223         }
46224       }
46225       return output;
46226     }
46227
46228     Hashes = {
46229       /**
46230        * @property {String} version
46231        * @readonly
46232        */
46233       VERSION: '1.0.6',
46234       /**
46235        * @member Hashes
46236        * @class Base64
46237        * @constructor
46238        */
46239       Base64: function() {
46240         // private properties
46241         var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
46242           pad = '=', // default pad according with the RFC standard
46243           utf8 = true; // by default enable UTF-8 support encoding
46244
46245         // public method for encoding
46246         this.encode = function(input) {
46247           var i, j, triplet,
46248             output = '',
46249             len = input.length;
46250
46251           pad = pad || '=';
46252           input = (utf8) ? utf8Encode(input) : input;
46253
46254           for (i = 0; i < len; i += 3) {
46255             triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
46256             for (j = 0; j < 4; j += 1) {
46257               if (i * 8 + j * 6 > len * 8) {
46258                 output += pad;
46259               } else {
46260                 output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
46261               }
46262             }
46263           }
46264           return output;
46265         };
46266
46267         // public method for decoding
46268         this.decode = function(input) {
46269           // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
46270           var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
46271             dec = '',
46272             arr = [];
46273           if (!input) {
46274             return input;
46275           }
46276
46277           i = ac = 0;
46278           input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
46279           //input += '';
46280
46281           do { // unpack four hexets into three octets using index points in b64
46282             h1 = tab.indexOf(input.charAt(i += 1));
46283             h2 = tab.indexOf(input.charAt(i += 1));
46284             h3 = tab.indexOf(input.charAt(i += 1));
46285             h4 = tab.indexOf(input.charAt(i += 1));
46286
46287             bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
46288
46289             o1 = bits >> 16 & 0xff;
46290             o2 = bits >> 8 & 0xff;
46291             o3 = bits & 0xff;
46292             ac += 1;
46293
46294             if (h3 === 64) {
46295               arr[ac] = String.fromCharCode(o1);
46296             } else if (h4 === 64) {
46297               arr[ac] = String.fromCharCode(o1, o2);
46298             } else {
46299               arr[ac] = String.fromCharCode(o1, o2, o3);
46300             }
46301           } while (i < input.length);
46302
46303           dec = arr.join('');
46304           dec = (utf8) ? utf8Decode(dec) : dec;
46305
46306           return dec;
46307         };
46308
46309         // set custom pad string
46310         this.setPad = function(str) {
46311           pad = str || pad;
46312           return this;
46313         };
46314         // set custom tab string characters
46315         this.setTab = function(str) {
46316           tab = str || tab;
46317           return this;
46318         };
46319         this.setUTF8 = function(bool) {
46320           if (typeof bool === 'boolean') {
46321             utf8 = bool;
46322           }
46323           return this;
46324         };
46325       },
46326
46327       /**
46328        * CRC-32 calculation
46329        * @member Hashes
46330        * @method CRC32
46331        * @static
46332        * @param {String} str Input String
46333        * @return {String}
46334        */
46335       CRC32: function(str) {
46336         var crc = 0,
46337           x = 0,
46338           y = 0,
46339           table, i, iTop;
46340         str = utf8Encode(str);
46341
46342         table = [
46343           '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
46344           '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
46345           '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
46346           '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
46347           'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
46348           '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
46349           'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
46350           '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
46351           'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
46352           '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
46353           'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
46354           '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
46355           'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
46356           '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
46357           '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
46358           '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
46359           '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
46360           'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
46361           '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
46362           'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
46363           '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
46364           'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
46365           '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
46366           'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
46367           '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
46368           'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
46369         ].join('');
46370
46371         crc = crc ^ (-1);
46372         for (i = 0, iTop = str.length; i < iTop; i += 1) {
46373           y = (crc ^ str.charCodeAt(i)) & 0xFF;
46374           x = '0x' + table.substr(y * 9, 8);
46375           crc = (crc >>> 8) ^ x;
46376         }
46377         // always return a positive number (that's what >>> 0 does)
46378         return (crc ^ (-1)) >>> 0;
46379       },
46380       /**
46381        * @member Hashes
46382        * @class MD5
46383        * @constructor
46384        * @param {Object} [config]
46385        *
46386        * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
46387        * Digest Algorithm, as defined in RFC 1321.
46388        * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
46389        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
46390        * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
46391        */
46392       MD5: function(options) {
46393         /**
46394          * Private config properties. You may need to tweak these to be compatible with
46395          * the server-side, but the defaults work in most cases.
46396          * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
46397          */
46398         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
46399           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
46400           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
46401
46402         // privileged (public) methods
46403         this.hex = function(s) {
46404           return rstr2hex(rstr(s, utf8), hexcase);
46405         };
46406         this.b64 = function(s) {
46407           return rstr2b64(rstr(s), b64pad);
46408         };
46409         this.any = function(s, e) {
46410           return rstr2any(rstr(s, utf8), e);
46411         };
46412         this.raw = function(s) {
46413           return rstr(s, utf8);
46414         };
46415         this.hex_hmac = function(k, d) {
46416           return rstr2hex(rstr_hmac(k, d), hexcase);
46417         };
46418         this.b64_hmac = function(k, d) {
46419           return rstr2b64(rstr_hmac(k, d), b64pad);
46420         };
46421         this.any_hmac = function(k, d, e) {
46422           return rstr2any(rstr_hmac(k, d), e);
46423         };
46424         /**
46425          * Perform a simple self-test to see if the VM is working
46426          * @return {String} Hexadecimal hash sample
46427          */
46428         this.vm_test = function() {
46429           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
46430         };
46431         /**
46432          * Enable/disable uppercase hexadecimal returned string
46433          * @param {Boolean}
46434          * @return {Object} this
46435          */
46436         this.setUpperCase = function(a) {
46437           if (typeof a === 'boolean') {
46438             hexcase = a;
46439           }
46440           return this;
46441         };
46442         /**
46443          * Defines a base64 pad string
46444          * @param {String} Pad
46445          * @return {Object} this
46446          */
46447         this.setPad = function(a) {
46448           b64pad = a || b64pad;
46449           return this;
46450         };
46451         /**
46452          * Defines a base64 pad string
46453          * @param {Boolean}
46454          * @return {Object} [this]
46455          */
46456         this.setUTF8 = function(a) {
46457           if (typeof a === 'boolean') {
46458             utf8 = a;
46459           }
46460           return this;
46461         };
46462
46463         // private methods
46464
46465         /**
46466          * Calculate the MD5 of a raw string
46467          */
46468
46469         function rstr(s) {
46470           s = (utf8) ? utf8Encode(s) : s;
46471           return binl2rstr(binl(rstr2binl(s), s.length * 8));
46472         }
46473
46474         /**
46475          * Calculate the HMAC-MD5, of a key and some data (raw strings)
46476          */
46477
46478         function rstr_hmac(key, data) {
46479           var bkey, ipad, opad, hash, i;
46480
46481           key = (utf8) ? utf8Encode(key) : key;
46482           data = (utf8) ? utf8Encode(data) : data;
46483           bkey = rstr2binl(key);
46484           if (bkey.length > 16) {
46485             bkey = binl(bkey, key.length * 8);
46486           }
46487
46488           ipad = Array(16), opad = Array(16);
46489           for (i = 0; i < 16; i += 1) {
46490             ipad[i] = bkey[i] ^ 0x36363636;
46491             opad[i] = bkey[i] ^ 0x5C5C5C5C;
46492           }
46493           hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
46494           return binl2rstr(binl(opad.concat(hash), 512 + 128));
46495         }
46496
46497         /**
46498          * Calculate the MD5 of an array of little-endian words, and a bit length.
46499          */
46500
46501         function binl(x, len) {
46502           var i, olda, oldb, oldc, oldd,
46503             a = 1732584193,
46504             b = -271733879,
46505             c = -1732584194,
46506             d = 271733878;
46507
46508           /* append padding */
46509           x[len >> 5] |= 0x80 << ((len) % 32);
46510           x[(((len + 64) >>> 9) << 4) + 14] = len;
46511
46512           for (i = 0; i < x.length; i += 16) {
46513             olda = a;
46514             oldb = b;
46515             oldc = c;
46516             oldd = d;
46517
46518             a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
46519             d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
46520             c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
46521             b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
46522             a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
46523             d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
46524             c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
46525             b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
46526             a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
46527             d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
46528             c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
46529             b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
46530             a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
46531             d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
46532             c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
46533             b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
46534
46535             a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
46536             d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
46537             c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
46538             b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
46539             a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
46540             d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
46541             c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
46542             b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
46543             a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
46544             d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
46545             c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
46546             b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
46547             a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
46548             d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
46549             c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
46550             b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
46551
46552             a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
46553             d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
46554             c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
46555             b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
46556             a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
46557             d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
46558             c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
46559             b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
46560             a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
46561             d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
46562             c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
46563             b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
46564             a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
46565             d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
46566             c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
46567             b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
46568
46569             a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
46570             d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
46571             c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
46572             b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
46573             a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
46574             d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
46575             c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
46576             b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
46577             a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
46578             d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
46579             c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
46580             b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
46581             a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
46582             d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
46583             c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
46584             b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
46585
46586             a = safe_add(a, olda);
46587             b = safe_add(b, oldb);
46588             c = safe_add(c, oldc);
46589             d = safe_add(d, oldd);
46590           }
46591           return Array(a, b, c, d);
46592         }
46593
46594         /**
46595          * These functions implement the four basic operations the algorithm uses.
46596          */
46597
46598         function md5_cmn(q, a, b, x, s, t) {
46599           return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
46600         }
46601
46602         function md5_ff(a, b, c, d, x, s, t) {
46603           return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
46604         }
46605
46606         function md5_gg(a, b, c, d, x, s, t) {
46607           return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
46608         }
46609
46610         function md5_hh(a, b, c, d, x, s, t) {
46611           return md5_cmn(b ^ c ^ d, a, b, x, s, t);
46612         }
46613
46614         function md5_ii(a, b, c, d, x, s, t) {
46615           return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
46616         }
46617       },
46618       /**
46619        * @member Hashes
46620        * @class Hashes.SHA1
46621        * @param {Object} [config]
46622        * @constructor
46623        *
46624        * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
46625        * Version 2.2 Copyright Paul Johnston 2000 - 2009.
46626        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
46627        * See http://pajhome.org.uk/crypt/md5 for details.
46628        */
46629       SHA1: function(options) {
46630         /**
46631          * Private config properties. You may need to tweak these to be compatible with
46632          * the server-side, but the defaults work in most cases.
46633          * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
46634          */
46635         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
46636           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
46637           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
46638
46639         // public methods
46640         this.hex = function(s) {
46641           return rstr2hex(rstr(s, utf8), hexcase);
46642         };
46643         this.b64 = function(s) {
46644           return rstr2b64(rstr(s, utf8), b64pad);
46645         };
46646         this.any = function(s, e) {
46647           return rstr2any(rstr(s, utf8), e);
46648         };
46649         this.raw = function(s) {
46650           return rstr(s, utf8);
46651         };
46652         this.hex_hmac = function(k, d) {
46653           return rstr2hex(rstr_hmac(k, d));
46654         };
46655         this.b64_hmac = function(k, d) {
46656           return rstr2b64(rstr_hmac(k, d), b64pad);
46657         };
46658         this.any_hmac = function(k, d, e) {
46659           return rstr2any(rstr_hmac(k, d), e);
46660         };
46661         /**
46662          * Perform a simple self-test to see if the VM is working
46663          * @return {String} Hexadecimal hash sample
46664          * @public
46665          */
46666         this.vm_test = function() {
46667           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
46668         };
46669         /**
46670          * @description Enable/disable uppercase hexadecimal returned string
46671          * @param {boolean}
46672          * @return {Object} this
46673          * @public
46674          */
46675         this.setUpperCase = function(a) {
46676           if (typeof a === 'boolean') {
46677             hexcase = a;
46678           }
46679           return this;
46680         };
46681         /**
46682          * @description Defines a base64 pad string
46683          * @param {string} Pad
46684          * @return {Object} this
46685          * @public
46686          */
46687         this.setPad = function(a) {
46688           b64pad = a || b64pad;
46689           return this;
46690         };
46691         /**
46692          * @description Defines a base64 pad string
46693          * @param {boolean}
46694          * @return {Object} this
46695          * @public
46696          */
46697         this.setUTF8 = function(a) {
46698           if (typeof a === 'boolean') {
46699             utf8 = a;
46700           }
46701           return this;
46702         };
46703
46704         // private methods
46705
46706         /**
46707          * Calculate the SHA-512 of a raw string
46708          */
46709
46710         function rstr(s) {
46711           s = (utf8) ? utf8Encode(s) : s;
46712           return binb2rstr(binb(rstr2binb(s), s.length * 8));
46713         }
46714
46715         /**
46716          * Calculate the HMAC-SHA1 of a key and some data (raw strings)
46717          */
46718
46719         function rstr_hmac(key, data) {
46720           var bkey, ipad, opad, i, hash;
46721           key = (utf8) ? utf8Encode(key) : key;
46722           data = (utf8) ? utf8Encode(data) : data;
46723           bkey = rstr2binb(key);
46724
46725           if (bkey.length > 16) {
46726             bkey = binb(bkey, key.length * 8);
46727           }
46728           ipad = Array(16), opad = Array(16);
46729           for (i = 0; i < 16; i += 1) {
46730             ipad[i] = bkey[i] ^ 0x36363636;
46731             opad[i] = bkey[i] ^ 0x5C5C5C5C;
46732           }
46733           hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
46734           return binb2rstr(binb(opad.concat(hash), 512 + 160));
46735         }
46736
46737         /**
46738          * Calculate the SHA-1 of an array of big-endian words, and a bit length
46739          */
46740
46741         function binb(x, len) {
46742           var i, j, t, olda, oldb, oldc, oldd, olde,
46743             w = Array(80),
46744             a = 1732584193,
46745             b = -271733879,
46746             c = -1732584194,
46747             d = 271733878,
46748             e = -1009589776;
46749
46750           /* append padding */
46751           x[len >> 5] |= 0x80 << (24 - len % 32);
46752           x[((len + 64 >> 9) << 4) + 15] = len;
46753
46754           for (i = 0; i < x.length; i += 16) {
46755             olda = a;
46756             oldb = b;
46757             oldc = c;
46758             oldd = d;
46759             olde = e;
46760
46761             for (j = 0; j < 80; j += 1) {
46762               if (j < 16) {
46763                 w[j] = x[i + j];
46764               } else {
46765                 w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
46766               }
46767               t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
46768                 safe_add(safe_add(e, w[j]), sha1_kt(j)));
46769               e = d;
46770               d = c;
46771               c = bit_rol(b, 30);
46772               b = a;
46773               a = t;
46774             }
46775
46776             a = safe_add(a, olda);
46777             b = safe_add(b, oldb);
46778             c = safe_add(c, oldc);
46779             d = safe_add(d, oldd);
46780             e = safe_add(e, olde);
46781           }
46782           return Array(a, b, c, d, e);
46783         }
46784
46785         /**
46786          * Perform the appropriate triplet combination function for the current
46787          * iteration
46788          */
46789
46790         function sha1_ft(t, b, c, d) {
46791           if (t < 20) {
46792             return (b & c) | ((~b) & d);
46793           }
46794           if (t < 40) {
46795             return b ^ c ^ d;
46796           }
46797           if (t < 60) {
46798             return (b & c) | (b & d) | (c & d);
46799           }
46800           return b ^ c ^ d;
46801         }
46802
46803         /**
46804          * Determine the appropriate additive constant for the current iteration
46805          */
46806
46807         function sha1_kt(t) {
46808           return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
46809             (t < 60) ? -1894007588 : -899497514;
46810         }
46811       },
46812       /**
46813        * @class Hashes.SHA256
46814        * @param {config}
46815        *
46816        * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
46817        * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
46818        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
46819        * See http://pajhome.org.uk/crypt/md5 for details.
46820        * Also http://anmar.eu.org/projects/jssha2/
46821        */
46822       SHA256: function(options) {
46823         /**
46824          * Private properties configuration variables. You may need to tweak these to be compatible with
46825          * the server-side, but the defaults work in most cases.
46826          * @see this.setUpperCase() method
46827          * @see this.setPad() method
46828          */
46829         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase  */
46830           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
46831           /* base-64 pad character. Default '=' for strict RFC compliance   */
46832           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
46833           /* enable/disable utf8 encoding */
46834           sha256_K;
46835
46836         /* privileged (public) methods */
46837         this.hex = function(s) {
46838           return rstr2hex(rstr(s, utf8));
46839         };
46840         this.b64 = function(s) {
46841           return rstr2b64(rstr(s, utf8), b64pad);
46842         };
46843         this.any = function(s, e) {
46844           return rstr2any(rstr(s, utf8), e);
46845         };
46846         this.raw = function(s) {
46847           return rstr(s, utf8);
46848         };
46849         this.hex_hmac = function(k, d) {
46850           return rstr2hex(rstr_hmac(k, d));
46851         };
46852         this.b64_hmac = function(k, d) {
46853           return rstr2b64(rstr_hmac(k, d), b64pad);
46854         };
46855         this.any_hmac = function(k, d, e) {
46856           return rstr2any(rstr_hmac(k, d), e);
46857         };
46858         /**
46859          * Perform a simple self-test to see if the VM is working
46860          * @return {String} Hexadecimal hash sample
46861          * @public
46862          */
46863         this.vm_test = function() {
46864           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
46865         };
46866         /**
46867          * Enable/disable uppercase hexadecimal returned string
46868          * @param {boolean}
46869          * @return {Object} this
46870          * @public
46871          */
46872         this.setUpperCase = function(a) {
46873           if (typeof a === 'boolean') {
46874             hexcase = a;
46875           }
46876           return this;
46877         };
46878         /**
46879          * @description Defines a base64 pad string
46880          * @param {string} Pad
46881          * @return {Object} this
46882          * @public
46883          */
46884         this.setPad = function(a) {
46885           b64pad = a || b64pad;
46886           return this;
46887         };
46888         /**
46889          * Defines a base64 pad string
46890          * @param {boolean}
46891          * @return {Object} this
46892          * @public
46893          */
46894         this.setUTF8 = function(a) {
46895           if (typeof a === 'boolean') {
46896             utf8 = a;
46897           }
46898           return this;
46899         };
46900
46901         // private methods
46902
46903         /**
46904          * Calculate the SHA-512 of a raw string
46905          */
46906
46907         function rstr(s, utf8) {
46908           s = (utf8) ? utf8Encode(s) : s;
46909           return binb2rstr(binb(rstr2binb(s), s.length * 8));
46910         }
46911
46912         /**
46913          * Calculate the HMAC-sha256 of a key and some data (raw strings)
46914          */
46915
46916         function rstr_hmac(key, data) {
46917           key = (utf8) ? utf8Encode(key) : key;
46918           data = (utf8) ? utf8Encode(data) : data;
46919           var hash, i = 0,
46920             bkey = rstr2binb(key),
46921             ipad = Array(16),
46922             opad = Array(16);
46923
46924           if (bkey.length > 16) {
46925             bkey = binb(bkey, key.length * 8);
46926           }
46927
46928           for (; i < 16; i += 1) {
46929             ipad[i] = bkey[i] ^ 0x36363636;
46930             opad[i] = bkey[i] ^ 0x5C5C5C5C;
46931           }
46932
46933           hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
46934           return binb2rstr(binb(opad.concat(hash), 512 + 256));
46935         }
46936
46937         /*
46938          * Main sha256 function, with its support functions
46939          */
46940
46941         function sha256_S(X, n) {
46942           return (X >>> n) | (X << (32 - n));
46943         }
46944
46945         function sha256_R(X, n) {
46946           return (X >>> n);
46947         }
46948
46949         function sha256_Ch(x, y, z) {
46950           return ((x & y) ^ ((~x) & z));
46951         }
46952
46953         function sha256_Maj(x, y, z) {
46954           return ((x & y) ^ (x & z) ^ (y & z));
46955         }
46956
46957         function sha256_Sigma0256(x) {
46958           return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
46959         }
46960
46961         function sha256_Sigma1256(x) {
46962           return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
46963         }
46964
46965         function sha256_Gamma0256(x) {
46966           return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
46967         }
46968
46969         function sha256_Gamma1256(x) {
46970           return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
46971         }
46972
46973         sha256_K = [
46974           1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
46975           1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
46976           264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
46977           113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
46978           1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
46979           430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
46980           1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998
46981         ];
46982
46983         function binb(m, l) {
46984           var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
46985             1359893119, -1694144372, 528734635, 1541459225
46986           ];
46987           var W = new Array(64);
46988           var a, b, c, d, e, f, g, h;
46989           var i, j, T1, T2;
46990
46991           /* append padding */
46992           m[l >> 5] |= 0x80 << (24 - l % 32);
46993           m[((l + 64 >> 9) << 4) + 15] = l;
46994
46995           for (i = 0; i < m.length; i += 16) {
46996             a = HASH[0];
46997             b = HASH[1];
46998             c = HASH[2];
46999             d = HASH[3];
47000             e = HASH[4];
47001             f = HASH[5];
47002             g = HASH[6];
47003             h = HASH[7];
47004
47005             for (j = 0; j < 64; j += 1) {
47006               if (j < 16) {
47007                 W[j] = m[j + i];
47008               } else {
47009                 W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
47010                   sha256_Gamma0256(W[j - 15])), W[j - 16]);
47011               }
47012
47013               T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
47014                 sha256_K[j]), W[j]);
47015               T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
47016               h = g;
47017               g = f;
47018               f = e;
47019               e = safe_add(d, T1);
47020               d = c;
47021               c = b;
47022               b = a;
47023               a = safe_add(T1, T2);
47024             }
47025
47026             HASH[0] = safe_add(a, HASH[0]);
47027             HASH[1] = safe_add(b, HASH[1]);
47028             HASH[2] = safe_add(c, HASH[2]);
47029             HASH[3] = safe_add(d, HASH[3]);
47030             HASH[4] = safe_add(e, HASH[4]);
47031             HASH[5] = safe_add(f, HASH[5]);
47032             HASH[6] = safe_add(g, HASH[6]);
47033             HASH[7] = safe_add(h, HASH[7]);
47034           }
47035           return HASH;
47036         }
47037
47038       },
47039
47040       /**
47041        * @class Hashes.SHA512
47042        * @param {config}
47043        *
47044        * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
47045        * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
47046        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
47047        * See http://pajhome.org.uk/crypt/md5 for details.
47048        */
47049       SHA512: function(options) {
47050         /**
47051          * Private properties configuration variables. You may need to tweak these to be compatible with
47052          * the server-side, but the defaults work in most cases.
47053          * @see this.setUpperCase() method
47054          * @see this.setPad() method
47055          */
47056         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
47057           /* hexadecimal output case format. false - lowercase; true - uppercase  */
47058           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
47059           /* base-64 pad character. Default '=' for strict RFC compliance   */
47060           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
47061           /* enable/disable utf8 encoding */
47062           sha512_k;
47063
47064         /* privileged (public) methods */
47065         this.hex = function(s) {
47066           return rstr2hex(rstr(s));
47067         };
47068         this.b64 = function(s) {
47069           return rstr2b64(rstr(s), b64pad);
47070         };
47071         this.any = function(s, e) {
47072           return rstr2any(rstr(s), e);
47073         };
47074         this.raw = function(s) {
47075           return rstr(s, utf8);
47076         };
47077         this.hex_hmac = function(k, d) {
47078           return rstr2hex(rstr_hmac(k, d));
47079         };
47080         this.b64_hmac = function(k, d) {
47081           return rstr2b64(rstr_hmac(k, d), b64pad);
47082         };
47083         this.any_hmac = function(k, d, e) {
47084           return rstr2any(rstr_hmac(k, d), e);
47085         };
47086         /**
47087          * Perform a simple self-test to see if the VM is working
47088          * @return {String} Hexadecimal hash sample
47089          * @public
47090          */
47091         this.vm_test = function() {
47092           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
47093         };
47094         /**
47095          * @description Enable/disable uppercase hexadecimal returned string
47096          * @param {boolean}
47097          * @return {Object} this
47098          * @public
47099          */
47100         this.setUpperCase = function(a) {
47101           if (typeof a === 'boolean') {
47102             hexcase = a;
47103           }
47104           return this;
47105         };
47106         /**
47107          * @description Defines a base64 pad string
47108          * @param {string} Pad
47109          * @return {Object} this
47110          * @public
47111          */
47112         this.setPad = function(a) {
47113           b64pad = a || b64pad;
47114           return this;
47115         };
47116         /**
47117          * @description Defines a base64 pad string
47118          * @param {boolean}
47119          * @return {Object} this
47120          * @public
47121          */
47122         this.setUTF8 = function(a) {
47123           if (typeof a === 'boolean') {
47124             utf8 = a;
47125           }
47126           return this;
47127         };
47128
47129         /* private methods */
47130
47131         /**
47132          * Calculate the SHA-512 of a raw string
47133          */
47134
47135         function rstr(s) {
47136           s = (utf8) ? utf8Encode(s) : s;
47137           return binb2rstr(binb(rstr2binb(s), s.length * 8));
47138         }
47139         /*
47140          * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
47141          */
47142
47143         function rstr_hmac(key, data) {
47144           key = (utf8) ? utf8Encode(key) : key;
47145           data = (utf8) ? utf8Encode(data) : data;
47146
47147           var hash, i = 0,
47148             bkey = rstr2binb(key),
47149             ipad = Array(32),
47150             opad = Array(32);
47151
47152           if (bkey.length > 32) {
47153             bkey = binb(bkey, key.length * 8);
47154           }
47155
47156           for (; i < 32; i += 1) {
47157             ipad[i] = bkey[i] ^ 0x36363636;
47158             opad[i] = bkey[i] ^ 0x5C5C5C5C;
47159           }
47160
47161           hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
47162           return binb2rstr(binb(opad.concat(hash), 1024 + 512));
47163         }
47164
47165         /**
47166          * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
47167          */
47168
47169         function binb(x, len) {
47170           var j, i, l,
47171             W = new Array(80),
47172             hash = new Array(16),
47173             //Initial hash values
47174             H = [
47175               new int64(0x6a09e667, -205731576),
47176               new int64(-1150833019, -2067093701),
47177               new int64(0x3c6ef372, -23791573),
47178               new int64(-1521486534, 0x5f1d36f1),
47179               new int64(0x510e527f, -1377402159),
47180               new int64(-1694144372, 0x2b3e6c1f),
47181               new int64(0x1f83d9ab, -79577749),
47182               new int64(0x5be0cd19, 0x137e2179)
47183             ],
47184             T1 = new int64(0, 0),
47185             T2 = new int64(0, 0),
47186             a = new int64(0, 0),
47187             b = new int64(0, 0),
47188             c = new int64(0, 0),
47189             d = new int64(0, 0),
47190             e = new int64(0, 0),
47191             f = new int64(0, 0),
47192             g = new int64(0, 0),
47193             h = new int64(0, 0),
47194             //Temporary variables not specified by the document
47195             s0 = new int64(0, 0),
47196             s1 = new int64(0, 0),
47197             Ch = new int64(0, 0),
47198             Maj = new int64(0, 0),
47199             r1 = new int64(0, 0),
47200             r2 = new int64(0, 0),
47201             r3 = new int64(0, 0);
47202
47203           if (sha512_k === undefined) {
47204             //SHA512 constants
47205             sha512_k = [
47206               new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
47207               new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
47208               new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
47209               new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
47210               new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
47211               new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
47212               new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
47213               new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
47214               new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
47215               new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
47216               new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
47217               new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
47218               new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
47219               new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
47220               new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
47221               new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
47222               new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
47223               new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
47224               new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
47225               new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
47226               new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
47227               new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
47228               new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
47229               new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
47230               new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
47231               new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
47232               new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
47233               new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
47234               new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
47235               new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
47236               new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
47237               new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
47238               new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
47239               new int64(-354779690, -840897762), new int64(-176337025, -294727304),
47240               new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
47241               new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
47242               new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
47243               new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
47244               new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
47245               new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
47246             ];
47247           }
47248
47249           for (i = 0; i < 80; i += 1) {
47250             W[i] = new int64(0, 0);
47251           }
47252
47253           // append padding to the source string. The format is described in the FIPS.
47254           x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
47255           x[((len + 128 >> 10) << 5) + 31] = len;
47256           l = x.length;
47257           for (i = 0; i < l; i += 32) { //32 dwords is the block size
47258             int64copy(a, H[0]);
47259             int64copy(b, H[1]);
47260             int64copy(c, H[2]);
47261             int64copy(d, H[3]);
47262             int64copy(e, H[4]);
47263             int64copy(f, H[5]);
47264             int64copy(g, H[6]);
47265             int64copy(h, H[7]);
47266
47267             for (j = 0; j < 16; j += 1) {
47268               W[j].h = x[i + 2 * j];
47269               W[j].l = x[i + 2 * j + 1];
47270             }
47271
47272             for (j = 16; j < 80; j += 1) {
47273               //sigma1
47274               int64rrot(r1, W[j - 2], 19);
47275               int64revrrot(r2, W[j - 2], 29);
47276               int64shr(r3, W[j - 2], 6);
47277               s1.l = r1.l ^ r2.l ^ r3.l;
47278               s1.h = r1.h ^ r2.h ^ r3.h;
47279               //sigma0
47280               int64rrot(r1, W[j - 15], 1);
47281               int64rrot(r2, W[j - 15], 8);
47282               int64shr(r3, W[j - 15], 7);
47283               s0.l = r1.l ^ r2.l ^ r3.l;
47284               s0.h = r1.h ^ r2.h ^ r3.h;
47285
47286               int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
47287             }
47288
47289             for (j = 0; j < 80; j += 1) {
47290               //Ch
47291               Ch.l = (e.l & f.l) ^ (~e.l & g.l);
47292               Ch.h = (e.h & f.h) ^ (~e.h & g.h);
47293
47294               //Sigma1
47295               int64rrot(r1, e, 14);
47296               int64rrot(r2, e, 18);
47297               int64revrrot(r3, e, 9);
47298               s1.l = r1.l ^ r2.l ^ r3.l;
47299               s1.h = r1.h ^ r2.h ^ r3.h;
47300
47301               //Sigma0
47302               int64rrot(r1, a, 28);
47303               int64revrrot(r2, a, 2);
47304               int64revrrot(r3, a, 7);
47305               s0.l = r1.l ^ r2.l ^ r3.l;
47306               s0.h = r1.h ^ r2.h ^ r3.h;
47307
47308               //Maj
47309               Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
47310               Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
47311
47312               int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
47313               int64add(T2, s0, Maj);
47314
47315               int64copy(h, g);
47316               int64copy(g, f);
47317               int64copy(f, e);
47318               int64add(e, d, T1);
47319               int64copy(d, c);
47320               int64copy(c, b);
47321               int64copy(b, a);
47322               int64add(a, T1, T2);
47323             }
47324             int64add(H[0], H[0], a);
47325             int64add(H[1], H[1], b);
47326             int64add(H[2], H[2], c);
47327             int64add(H[3], H[3], d);
47328             int64add(H[4], H[4], e);
47329             int64add(H[5], H[5], f);
47330             int64add(H[6], H[6], g);
47331             int64add(H[7], H[7], h);
47332           }
47333
47334           //represent the hash as an array of 32-bit dwords
47335           for (i = 0; i < 8; i += 1) {
47336             hash[2 * i] = H[i].h;
47337             hash[2 * i + 1] = H[i].l;
47338           }
47339           return hash;
47340         }
47341
47342         //A constructor for 64-bit numbers
47343
47344         function int64(h, l) {
47345           this.h = h;
47346           this.l = l;
47347           //this.toString = int64toString;
47348         }
47349
47350         //Copies src into dst, assuming both are 64-bit numbers
47351
47352         function int64copy(dst, src) {
47353           dst.h = src.h;
47354           dst.l = src.l;
47355         }
47356
47357         //Right-rotates a 64-bit number by shift
47358         //Won't handle cases of shift>=32
47359         //The function revrrot() is for that
47360
47361         function int64rrot(dst, x, shift) {
47362           dst.l = (x.l >>> shift) | (x.h << (32 - shift));
47363           dst.h = (x.h >>> shift) | (x.l << (32 - shift));
47364         }
47365
47366         //Reverses the dwords of the source and then rotates right by shift.
47367         //This is equivalent to rotation by 32+shift
47368
47369         function int64revrrot(dst, x, shift) {
47370           dst.l = (x.h >>> shift) | (x.l << (32 - shift));
47371           dst.h = (x.l >>> shift) | (x.h << (32 - shift));
47372         }
47373
47374         //Bitwise-shifts right a 64-bit number by shift
47375         //Won't handle shift>=32, but it's never needed in SHA512
47376
47377         function int64shr(dst, x, shift) {
47378           dst.l = (x.l >>> shift) | (x.h << (32 - shift));
47379           dst.h = (x.h >>> shift);
47380         }
47381
47382         //Adds two 64-bit numbers
47383         //Like the original implementation, does not rely on 32-bit operations
47384
47385         function int64add(dst, x, y) {
47386           var w0 = (x.l & 0xffff) + (y.l & 0xffff);
47387           var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
47388           var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
47389           var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
47390           dst.l = (w0 & 0xffff) | (w1 << 16);
47391           dst.h = (w2 & 0xffff) | (w3 << 16);
47392         }
47393
47394         //Same, except with 4 addends. Works faster than adding them one by one.
47395
47396         function int64add4(dst, a, b, c, d) {
47397           var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
47398           var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
47399           var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
47400           var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
47401           dst.l = (w0 & 0xffff) | (w1 << 16);
47402           dst.h = (w2 & 0xffff) | (w3 << 16);
47403         }
47404
47405         //Same, except with 5 addends
47406
47407         function int64add5(dst, a, b, c, d, e) {
47408           var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
47409             w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
47410             w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
47411             w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
47412           dst.l = (w0 & 0xffff) | (w1 << 16);
47413           dst.h = (w2 & 0xffff) | (w3 << 16);
47414         }
47415       },
47416       /**
47417        * @class Hashes.RMD160
47418        * @constructor
47419        * @param {Object} [config]
47420        *
47421        * A JavaScript implementation of the RIPEMD-160 Algorithm
47422        * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
47423        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
47424        * See http://pajhome.org.uk/crypt/md5 for details.
47425        * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
47426        */
47427       RMD160: function(options) {
47428         /**
47429          * Private properties configuration variables. You may need to tweak these to be compatible with
47430          * the server-side, but the defaults work in most cases.
47431          * @see this.setUpperCase() method
47432          * @see this.setPad() method
47433          */
47434         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
47435           /* hexadecimal output case format. false - lowercase; true - uppercase  */
47436           b64pad = (options && typeof options.pad === 'string') ? options.pa : '=',
47437           /* base-64 pad character. Default '=' for strict RFC compliance   */
47438           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
47439           /* enable/disable utf8 encoding */
47440           rmd160_r1 = [
47441             0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
47442             7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
47443             3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
47444             1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
47445             4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
47446           ],
47447           rmd160_r2 = [
47448             5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
47449             6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
47450             15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
47451             8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
47452             12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
47453           ],
47454           rmd160_s1 = [
47455             11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
47456             7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
47457             11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
47458             11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
47459             9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
47460           ],
47461           rmd160_s2 = [
47462             8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
47463             9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
47464             9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
47465             15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
47466             8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
47467           ];
47468
47469         /* privileged (public) methods */
47470         this.hex = function(s) {
47471           return rstr2hex(rstr(s, utf8));
47472         };
47473         this.b64 = function(s) {
47474           return rstr2b64(rstr(s, utf8), b64pad);
47475         };
47476         this.any = function(s, e) {
47477           return rstr2any(rstr(s, utf8), e);
47478         };
47479         this.raw = function(s) {
47480           return rstr(s, utf8);
47481         };
47482         this.hex_hmac = function(k, d) {
47483           return rstr2hex(rstr_hmac(k, d));
47484         };
47485         this.b64_hmac = function(k, d) {
47486           return rstr2b64(rstr_hmac(k, d), b64pad);
47487         };
47488         this.any_hmac = function(k, d, e) {
47489           return rstr2any(rstr_hmac(k, d), e);
47490         };
47491         /**
47492          * Perform a simple self-test to see if the VM is working
47493          * @return {String} Hexadecimal hash sample
47494          * @public
47495          */
47496         this.vm_test = function() {
47497           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
47498         };
47499         /**
47500          * @description Enable/disable uppercase hexadecimal returned string
47501          * @param {boolean}
47502          * @return {Object} this
47503          * @public
47504          */
47505         this.setUpperCase = function(a) {
47506           if (typeof a === 'boolean') {
47507             hexcase = a;
47508           }
47509           return this;
47510         };
47511         /**
47512          * @description Defines a base64 pad string
47513          * @param {string} Pad
47514          * @return {Object} this
47515          * @public
47516          */
47517         this.setPad = function(a) {
47518           if (typeof a !== 'undefined') {
47519             b64pad = a;
47520           }
47521           return this;
47522         };
47523         /**
47524          * @description Defines a base64 pad string
47525          * @param {boolean}
47526          * @return {Object} this
47527          * @public
47528          */
47529         this.setUTF8 = function(a) {
47530           if (typeof a === 'boolean') {
47531             utf8 = a;
47532           }
47533           return this;
47534         };
47535
47536         /* private methods */
47537
47538         /**
47539          * Calculate the rmd160 of a raw string
47540          */
47541
47542         function rstr(s) {
47543           s = (utf8) ? utf8Encode(s) : s;
47544           return binl2rstr(binl(rstr2binl(s), s.length * 8));
47545         }
47546
47547         /**
47548          * Calculate the HMAC-rmd160 of a key and some data (raw strings)
47549          */
47550
47551         function rstr_hmac(key, data) {
47552           key = (utf8) ? utf8Encode(key) : key;
47553           data = (utf8) ? utf8Encode(data) : data;
47554           var i, hash,
47555             bkey = rstr2binl(key),
47556             ipad = Array(16),
47557             opad = Array(16);
47558
47559           if (bkey.length > 16) {
47560             bkey = binl(bkey, key.length * 8);
47561           }
47562
47563           for (i = 0; i < 16; i += 1) {
47564             ipad[i] = bkey[i] ^ 0x36363636;
47565             opad[i] = bkey[i] ^ 0x5C5C5C5C;
47566           }
47567           hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
47568           return binl2rstr(binl(opad.concat(hash), 512 + 160));
47569         }
47570
47571         /**
47572          * Convert an array of little-endian words to a string
47573          */
47574
47575         function binl2rstr(input) {
47576           var i, output = '',
47577             l = input.length * 32;
47578           for (i = 0; i < l; i += 8) {
47579             output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
47580           }
47581           return output;
47582         }
47583
47584         /**
47585          * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
47586          */
47587
47588         function binl(x, len) {
47589           var T, j, i, l,
47590             h0 = 0x67452301,
47591             h1 = 0xefcdab89,
47592             h2 = 0x98badcfe,
47593             h3 = 0x10325476,
47594             h4 = 0xc3d2e1f0,
47595             A1, B1, C1, D1, E1,
47596             A2, B2, C2, D2, E2;
47597
47598           /* append padding */
47599           x[len >> 5] |= 0x80 << (len % 32);
47600           x[(((len + 64) >>> 9) << 4) + 14] = len;
47601           l = x.length;
47602
47603           for (i = 0; i < l; i += 16) {
47604             A1 = A2 = h0;
47605             B1 = B2 = h1;
47606             C1 = C2 = h2;
47607             D1 = D2 = h3;
47608             E1 = E2 = h4;
47609             for (j = 0; j <= 79; j += 1) {
47610               T = safe_add(A1, rmd160_f(j, B1, C1, D1));
47611               T = safe_add(T, x[i + rmd160_r1[j]]);
47612               T = safe_add(T, rmd160_K1(j));
47613               T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
47614               A1 = E1;
47615               E1 = D1;
47616               D1 = bit_rol(C1, 10);
47617               C1 = B1;
47618               B1 = T;
47619               T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
47620               T = safe_add(T, x[i + rmd160_r2[j]]);
47621               T = safe_add(T, rmd160_K2(j));
47622               T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
47623               A2 = E2;
47624               E2 = D2;
47625               D2 = bit_rol(C2, 10);
47626               C2 = B2;
47627               B2 = T;
47628             }
47629
47630             T = safe_add(h1, safe_add(C1, D2));
47631             h1 = safe_add(h2, safe_add(D1, E2));
47632             h2 = safe_add(h3, safe_add(E1, A2));
47633             h3 = safe_add(h4, safe_add(A1, B2));
47634             h4 = safe_add(h0, safe_add(B1, C2));
47635             h0 = T;
47636           }
47637           return [h0, h1, h2, h3, h4];
47638         }
47639
47640         // specific algorithm methods
47641
47642         function rmd160_f(j, x, y, z) {
47643           return (0 <= j && j <= 15) ? (x ^ y ^ z) :
47644             (16 <= j && j <= 31) ? (x & y) | (~x & z) :
47645             (32 <= j && j <= 47) ? (x | ~y) ^ z :
47646             (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
47647             (64 <= j && j <= 79) ? x ^ (y | ~z) :
47648             'rmd160_f: j out of range';
47649         }
47650
47651         function rmd160_K1(j) {
47652           return (0 <= j && j <= 15) ? 0x00000000 :
47653             (16 <= j && j <= 31) ? 0x5a827999 :
47654             (32 <= j && j <= 47) ? 0x6ed9eba1 :
47655             (48 <= j && j <= 63) ? 0x8f1bbcdc :
47656             (64 <= j && j <= 79) ? 0xa953fd4e :
47657             'rmd160_K1: j out of range';
47658         }
47659
47660         function rmd160_K2(j) {
47661           return (0 <= j && j <= 15) ? 0x50a28be6 :
47662             (16 <= j && j <= 31) ? 0x5c4dd124 :
47663             (32 <= j && j <= 47) ? 0x6d703ef3 :
47664             (48 <= j && j <= 63) ? 0x7a6d76e9 :
47665             (64 <= j && j <= 79) ? 0x00000000 :
47666             'rmd160_K2: j out of range';
47667         }
47668       }
47669     };
47670
47671     // exposes Hashes
47672     (function(window, undefined$1) {
47673       var freeExports = false;
47674       {
47675         freeExports = exports;
47676         if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
47677           window = commonjsGlobal;
47678         }
47679       }
47680
47681       if (typeof undefined$1 === 'function' && typeof undefined$1.amd === 'object' && undefined$1.amd) {
47682         // define as an anonymous module, so, through path mapping, it can be aliased
47683         undefined$1(function() {
47684           return Hashes;
47685         });
47686       } else if (freeExports) {
47687         // in Node.js or RingoJS v0.8.0+
47688         if (module && module.exports === freeExports) {
47689           module.exports = Hashes;
47690         }
47691         // in Narwhal or RingoJS v0.7.0-
47692         else {
47693           freeExports.Hashes = Hashes;
47694         }
47695       } else {
47696         // in a browser or Rhino
47697         window.Hashes = Hashes;
47698       }
47699     }(this));
47700   }()); // IIFE
47701   });
47702
47703   var immutable = extend$2;
47704
47705   var hasOwnProperty$g = Object.prototype.hasOwnProperty;
47706
47707   function extend$2() {
47708       var target = {};
47709
47710       for (var i = 0; i < arguments.length; i++) {
47711           var source = arguments[i];
47712
47713           for (var key in source) {
47714               if (hasOwnProperty$g.call(source, key)) {
47715                   target[key] = source[key];
47716               }
47717           }
47718       }
47719
47720       return target
47721   }
47722
47723   var sha1 = new hashes.SHA1();
47724
47725   var ohauth = {};
47726
47727   ohauth.qsString = function(obj) {
47728       return Object.keys(obj).sort().map(function(key) {
47729           return ohauth.percentEncode(key) + '=' +
47730               ohauth.percentEncode(obj[key]);
47731       }).join('&');
47732   };
47733
47734   ohauth.stringQs = function(str) {
47735       return str.split('&').filter(function (pair) {
47736           return pair !== '';
47737       }).reduce(function(obj, pair){
47738           var parts = pair.split('=');
47739           obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
47740               '' : decodeURIComponent(parts[1]);
47741           return obj;
47742       }, {});
47743   };
47744
47745   ohauth.rawxhr = function(method, url, data, headers, callback) {
47746       var xhr = new XMLHttpRequest(),
47747           twoHundred = /^20\d$/;
47748       xhr.onreadystatechange = function() {
47749           if (4 === xhr.readyState && 0 !== xhr.status) {
47750               if (twoHundred.test(xhr.status)) callback(null, xhr);
47751               else return callback(xhr, null);
47752           }
47753       };
47754       xhr.onerror = function(e) { return callback(e, null); };
47755       xhr.open(method, url, true);
47756       for (var h in headers) xhr.setRequestHeader(h, headers[h]);
47757       xhr.send(data);
47758       return xhr;
47759   };
47760
47761   ohauth.xhr = function(method, url, auth, data, options, callback) {
47762       var headers = (options && options.header) || {
47763           'Content-Type': 'application/x-www-form-urlencoded'
47764       };
47765       headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
47766       return ohauth.rawxhr(method, url, data, headers, callback);
47767   };
47768
47769   ohauth.nonce = function() {
47770       for (var o = ''; o.length < 6;) {
47771           o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
47772       }
47773       return o;
47774   };
47775
47776   ohauth.authHeader = function(obj) {
47777       return Object.keys(obj).sort().map(function(key) {
47778           return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
47779       }).join(', ');
47780   };
47781
47782   ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
47783
47784   ohauth.percentEncode = function(s) {
47785       return encodeURIComponent(s)
47786           .replace(/\!/g, '%21').replace(/\'/g, '%27')
47787           .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
47788   };
47789
47790   ohauth.baseString = function(method, url, params) {
47791       if (params.oauth_signature) delete params.oauth_signature;
47792       return [
47793           method,
47794           ohauth.percentEncode(url),
47795           ohauth.percentEncode(ohauth.qsString(params))].join('&');
47796   };
47797
47798   ohauth.signature = function(oauth_secret, token_secret, baseString) {
47799       return sha1.b64_hmac(
47800           ohauth.percentEncode(oauth_secret) + '&' +
47801           ohauth.percentEncode(token_secret),
47802           baseString);
47803   };
47804
47805   /**
47806    * Takes an options object for configuration (consumer_key,
47807    * consumer_secret, version, signature_method, token, token_secret)
47808    * and returns a function that generates the Authorization header
47809    * for given data.
47810    *
47811    * The returned function takes these parameters:
47812    * - method: GET/POST/...
47813    * - uri: full URI with protocol, port, path and query string
47814    * - extra_params: any extra parameters (that are passed in the POST data),
47815    *   can be an object or a from-urlencoded string.
47816    *
47817    * Returned function returns full OAuth header with "OAuth" string in it.
47818    */
47819
47820   ohauth.headerGenerator = function(options) {
47821       options = options || {};
47822       var consumer_key = options.consumer_key || '',
47823           consumer_secret = options.consumer_secret || '',
47824           signature_method = options.signature_method || 'HMAC-SHA1',
47825           version = options.version || '1.0',
47826           token = options.token || '',
47827           token_secret = options.token_secret || '';
47828
47829       return function(method, uri, extra_params) {
47830           method = method.toUpperCase();
47831           if (typeof extra_params === 'string' && extra_params.length > 0) {
47832               extra_params = ohauth.stringQs(extra_params);
47833           }
47834
47835           var uri_parts = uri.split('?', 2),
47836           base_uri = uri_parts[0];
47837
47838           var query_params = uri_parts.length === 2 ?
47839               ohauth.stringQs(uri_parts[1]) : {};
47840
47841           var oauth_params = {
47842               oauth_consumer_key: consumer_key,
47843               oauth_signature_method: signature_method,
47844               oauth_version: version,
47845               oauth_timestamp: ohauth.timestamp(),
47846               oauth_nonce: ohauth.nonce()
47847           };
47848
47849           if (token) oauth_params.oauth_token = token;
47850
47851           var all_params = immutable({}, oauth_params, query_params, extra_params),
47852               base_str = ohauth.baseString(method, base_uri, all_params);
47853
47854           oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
47855
47856           return 'OAuth ' + ohauth.authHeader(oauth_params);
47857       };
47858   };
47859
47860   var ohauth_1 = ohauth;
47861
47862   var resolveUrl = createCommonjsModule(function (module, exports) {
47863   // Copyright 2014 Simon Lydell
47864   // X11 (“MIT”) Licensed. (See LICENSE.)
47865
47866   void (function(root, factory) {
47867     {
47868       module.exports = factory();
47869     }
47870   }(commonjsGlobal, function() {
47871
47872     function resolveUrl(/* ...urls */) {
47873       var numUrls = arguments.length;
47874
47875       if (numUrls === 0) {
47876         throw new Error("resolveUrl requires at least one argument; got none.")
47877       }
47878
47879       var base = document.createElement("base");
47880       base.href = arguments[0];
47881
47882       if (numUrls === 1) {
47883         return base.href
47884       }
47885
47886       var head = document.getElementsByTagName("head")[0];
47887       head.insertBefore(base, head.firstChild);
47888
47889       var a = document.createElement("a");
47890       var resolved;
47891
47892       for (var index = 1; index < numUrls; index++) {
47893         a.href = arguments[index];
47894         resolved = a.href;
47895         base.href = resolved;
47896       }
47897
47898       head.removeChild(base);
47899
47900       return resolved
47901     }
47902
47903     return resolveUrl
47904
47905   }));
47906   });
47907
47908   var assign$1 = make_assign();
47909   var create$2 = make_create();
47910   var trim = make_trim();
47911   var Global = (typeof window !== 'undefined' ? window : commonjsGlobal);
47912
47913   var util = {
47914         assign: assign$1,
47915         create: create$2,
47916         trim: trim,
47917         bind: bind,
47918         slice: slice$7,
47919         each: each,
47920         map: map$4,
47921         pluck: pluck,
47922         isList: isList,
47923         isFunction: isFunction$1,
47924         isObject: isObject$1,
47925         Global: Global
47926   };
47927
47928   function make_assign() {
47929         if (Object.assign) {
47930                 return Object.assign
47931         } else {
47932                 return function shimAssign(obj, props1, props2, etc) {
47933                         for (var i = 1; i < arguments.length; i++) {
47934                                 each(Object(arguments[i]), function(val, key) {
47935                                         obj[key] = val;
47936                                 });
47937                         }                       
47938                         return obj
47939                 }
47940         }
47941   }
47942
47943   function make_create() {
47944         if (Object.create) {
47945                 return function create(obj, assignProps1, assignProps2, etc) {
47946                         var assignArgsList = slice$7(arguments, 1);
47947                         return assign$1.apply(this, [Object.create(obj)].concat(assignArgsList))
47948                 }
47949         } else {
47950                 function F() {} // eslint-disable-line no-inner-declarations
47951                 return function create(obj, assignProps1, assignProps2, etc) {
47952                         var assignArgsList = slice$7(arguments, 1);
47953                         F.prototype = obj;
47954                         return assign$1.apply(this, [new F()].concat(assignArgsList))
47955                 }
47956         }
47957   }
47958
47959   function make_trim() {
47960         if (String.prototype.trim) {
47961                 return function trim(str) {
47962                         return String.prototype.trim.call(str)
47963                 }
47964         } else {
47965                 return function trim(str) {
47966                         return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
47967                 }
47968         }
47969   }
47970
47971   function bind(obj, fn) {
47972         return function() {
47973                 return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
47974         }
47975   }
47976
47977   function slice$7(arr, index) {
47978         return Array.prototype.slice.call(arr, index || 0)
47979   }
47980
47981   function each(obj, fn) {
47982         pluck(obj, function(val, key) {
47983                 fn(val, key);
47984                 return false
47985         });
47986   }
47987
47988   function map$4(obj, fn) {
47989         var res = (isList(obj) ? [] : {});
47990         pluck(obj, function(v, k) {
47991                 res[k] = fn(v, k);
47992                 return false
47993         });
47994         return res
47995   }
47996
47997   function pluck(obj, fn) {
47998         if (isList(obj)) {
47999                 for (var i=0; i<obj.length; i++) {
48000                         if (fn(obj[i], i)) {
48001                                 return obj[i]
48002                         }
48003                 }
48004         } else {
48005                 for (var key in obj) {
48006                         if (obj.hasOwnProperty(key)) {
48007                                 if (fn(obj[key], key)) {
48008                                         return obj[key]
48009                                 }
48010                         }
48011                 }
48012         }
48013   }
48014
48015   function isList(val) {
48016         return (val != null && typeof val != 'function' && typeof val.length == 'number')
48017   }
48018
48019   function isFunction$1(val) {
48020         return val && {}.toString.call(val) === '[object Function]'
48021   }
48022
48023   function isObject$1(val) {
48024         return val && {}.toString.call(val) === '[object Object]'
48025   }
48026
48027   var slice$8 = util.slice;
48028   var pluck$1 = util.pluck;
48029   var each$1 = util.each;
48030   var bind$1 = util.bind;
48031   var create$3 = util.create;
48032   var isList$1 = util.isList;
48033   var isFunction$2 = util.isFunction;
48034   var isObject$2 = util.isObject;
48035
48036   var storeEngine = {
48037         createStore: createStore
48038   };
48039
48040   var storeAPI = {
48041         version: '2.0.12',
48042         enabled: false,
48043         
48044         // get returns the value of the given key. If that value
48045         // is undefined, it returns optionalDefaultValue instead.
48046         get: function(key, optionalDefaultValue) {
48047                 var data = this.storage.read(this._namespacePrefix + key);
48048                 return this._deserialize(data, optionalDefaultValue)
48049         },
48050
48051         // set will store the given value at key and returns value.
48052         // Calling set with value === undefined is equivalent to calling remove.
48053         set: function(key, value) {
48054                 if (value === undefined) {
48055                         return this.remove(key)
48056                 }
48057                 this.storage.write(this._namespacePrefix + key, this._serialize(value));
48058                 return value
48059         },
48060
48061         // remove deletes the key and value stored at the given key.
48062         remove: function(key) {
48063                 this.storage.remove(this._namespacePrefix + key);
48064         },
48065
48066         // each will call the given callback once for each key-value pair
48067         // in this store.
48068         each: function(callback) {
48069                 var self = this;
48070                 this.storage.each(function(val, namespacedKey) {
48071                         callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
48072                 });
48073         },
48074
48075         // clearAll will remove all the stored key-value pairs in this store.
48076         clearAll: function() {
48077                 this.storage.clearAll();
48078         },
48079
48080         // additional functionality that can't live in plugins
48081         // ---------------------------------------------------
48082
48083         // hasNamespace returns true if this store instance has the given namespace.
48084         hasNamespace: function(namespace) {
48085                 return (this._namespacePrefix == '__storejs_'+namespace+'_')
48086         },
48087
48088         // createStore creates a store.js instance with the first
48089         // functioning storage in the list of storage candidates,
48090         // and applies the the given mixins to the instance.
48091         createStore: function() {
48092                 return createStore.apply(this, arguments)
48093         },
48094         
48095         addPlugin: function(plugin) {
48096                 this._addPlugin(plugin);
48097         },
48098         
48099         namespace: function(namespace) {
48100                 return createStore(this.storage, this.plugins, namespace)
48101         }
48102   };
48103
48104   function _warn() {
48105         var _console = (typeof console == 'undefined' ? null : console);
48106         if (!_console) { return }
48107         var fn = (_console.warn ? _console.warn : _console.log);
48108         fn.apply(_console, arguments);
48109   }
48110
48111   function createStore(storages, plugins, namespace) {
48112         if (!namespace) {
48113                 namespace = '';
48114         }
48115         if (storages && !isList$1(storages)) {
48116                 storages = [storages];
48117         }
48118         if (plugins && !isList$1(plugins)) {
48119                 plugins = [plugins];
48120         }
48121
48122         var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '');
48123         var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null);
48124         var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
48125         if (!legalNamespaces.test(namespace)) {
48126                 throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes')
48127         }
48128         
48129         var _privateStoreProps = {
48130                 _namespacePrefix: namespacePrefix,
48131                 _namespaceRegexp: namespaceRegexp,
48132
48133                 _testStorage: function(storage) {
48134                         try {
48135                                 var testStr = '__storejs__test__';
48136                                 storage.write(testStr, testStr);
48137                                 var ok = (storage.read(testStr) === testStr);
48138                                 storage.remove(testStr);
48139                                 return ok
48140                         } catch(e) {
48141                                 return false
48142                         }
48143                 },
48144
48145                 _assignPluginFnProp: function(pluginFnProp, propName) {
48146                         var oldFn = this[propName];
48147                         this[propName] = function pluginFn() {
48148                                 var args = slice$8(arguments, 0);
48149                                 var self = this;
48150
48151                                 // super_fn calls the old function which was overwritten by
48152                                 // this mixin.
48153                                 function super_fn() {
48154                                         if (!oldFn) { return }
48155                                         each$1(arguments, function(arg, i) {
48156                                                 args[i] = arg;
48157                                         });
48158                                         return oldFn.apply(self, args)
48159                                 }
48160
48161                                 // Give mixing function access to super_fn by prefixing all mixin function
48162                                 // arguments with super_fn.
48163                                 var newFnArgs = [super_fn].concat(args);
48164
48165                                 return pluginFnProp.apply(self, newFnArgs)
48166                         };
48167                 },
48168
48169                 _serialize: function(obj) {
48170                         return JSON.stringify(obj)
48171                 },
48172
48173                 _deserialize: function(strVal, defaultVal) {
48174                         if (!strVal) { return defaultVal }
48175                         // It is possible that a raw string value has been previously stored
48176                         // in a storage without using store.js, meaning it will be a raw
48177                         // string value instead of a JSON serialized string. By defaulting
48178                         // to the raw string value in case of a JSON parse error, we allow
48179                         // for past stored values to be forwards-compatible with store.js
48180                         var val = '';
48181                         try { val = JSON.parse(strVal); }
48182                         catch(e) { val = strVal; }
48183
48184                         return (val !== undefined ? val : defaultVal)
48185                 },
48186                 
48187                 _addStorage: function(storage) {
48188                         if (this.enabled) { return }
48189                         if (this._testStorage(storage)) {
48190                                 this.storage = storage;
48191                                 this.enabled = true;
48192                         }
48193                 },
48194
48195                 _addPlugin: function(plugin) {
48196                         var self = this;
48197
48198                         // If the plugin is an array, then add all plugins in the array.
48199                         // This allows for a plugin to depend on other plugins.
48200                         if (isList$1(plugin)) {
48201                                 each$1(plugin, function(plugin) {
48202                                         self._addPlugin(plugin);
48203                                 });
48204                                 return
48205                         }
48206
48207                         // Keep track of all plugins we've seen so far, so that we
48208                         // don't add any of them twice.
48209                         var seenPlugin = pluck$1(this.plugins, function(seenPlugin) {
48210                                 return (plugin === seenPlugin)
48211                         });
48212                         if (seenPlugin) {
48213                                 return
48214                         }
48215                         this.plugins.push(plugin);
48216
48217                         // Check that the plugin is properly formed
48218                         if (!isFunction$2(plugin)) {
48219                                 throw new Error('Plugins must be function values that return objects')
48220                         }
48221
48222                         var pluginProperties = plugin.call(this);
48223                         if (!isObject$2(pluginProperties)) {
48224                                 throw new Error('Plugins must return an object of function properties')
48225                         }
48226
48227                         // Add the plugin function properties to this store instance.
48228                         each$1(pluginProperties, function(pluginFnProp, propName) {
48229                                 if (!isFunction$2(pluginFnProp)) {
48230                                         throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
48231                                 }
48232                                 self._assignPluginFnProp(pluginFnProp, propName);
48233                         });
48234                 },
48235                 
48236                 // Put deprecated properties in the private API, so as to not expose it to accidential
48237                 // discovery through inspection of the store object.
48238                 
48239                 // Deprecated: addStorage
48240                 addStorage: function(storage) {
48241                         _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
48242                         this._addStorage(storage);
48243                 }
48244         };
48245
48246         var store = create$3(_privateStoreProps, storeAPI, {
48247                 plugins: []
48248         });
48249         store.raw = {};
48250         each$1(store, function(prop, propName) {
48251                 if (isFunction$2(prop)) {
48252                         store.raw[propName] = bind$1(store, prop);                      
48253                 }
48254         });
48255         each$1(storages, function(storage) {
48256                 store._addStorage(storage);
48257         });
48258         each$1(plugins, function(plugin) {
48259                 store._addPlugin(plugin);
48260         });
48261         return store
48262   }
48263
48264   var Global$1 = util.Global;
48265
48266   var localStorage_1 = {
48267         name: 'localStorage',
48268         read: read,
48269         write: write,
48270         each: each$2,
48271         remove: remove$2,
48272         clearAll: clearAll,
48273   };
48274
48275   function localStorage$1() {
48276         return Global$1.localStorage
48277   }
48278
48279   function read(key) {
48280         return localStorage$1().getItem(key)
48281   }
48282
48283   function write(key, data) {
48284         return localStorage$1().setItem(key, data)
48285   }
48286
48287   function each$2(fn) {
48288         for (var i = localStorage$1().length - 1; i >= 0; i--) {
48289                 var key = localStorage$1().key(i);
48290                 fn(read(key), key);
48291         }
48292   }
48293
48294   function remove$2(key) {
48295         return localStorage$1().removeItem(key)
48296   }
48297
48298   function clearAll() {
48299         return localStorage$1().clear()
48300   }
48301
48302   // oldFF-globalStorage provides storage for Firefox
48303   // versions 6 and 7, where no localStorage, etc
48304   // is available.
48305
48306
48307   var Global$2 = util.Global;
48308
48309   var oldFFGlobalStorage = {
48310         name: 'oldFF-globalStorage',
48311         read: read$1,
48312         write: write$1,
48313         each: each$3,
48314         remove: remove$3,
48315         clearAll: clearAll$1,
48316   };
48317
48318   var globalStorage = Global$2.globalStorage;
48319
48320   function read$1(key) {
48321         return globalStorage[key]
48322   }
48323
48324   function write$1(key, data) {
48325         globalStorage[key] = data;
48326   }
48327
48328   function each$3(fn) {
48329         for (var i = globalStorage.length - 1; i >= 0; i--) {
48330                 var key = globalStorage.key(i);
48331                 fn(globalStorage[key], key);
48332         }
48333   }
48334
48335   function remove$3(key) {
48336         return globalStorage.removeItem(key)
48337   }
48338
48339   function clearAll$1() {
48340         each$3(function(key, _) {
48341                 delete globalStorage[key];
48342         });
48343   }
48344
48345   // oldIE-userDataStorage provides storage for Internet Explorer
48346   // versions 6 and 7, where no localStorage, sessionStorage, etc
48347   // is available.
48348
48349
48350   var Global$3 = util.Global;
48351
48352   var oldIEUserDataStorage = {
48353         name: 'oldIE-userDataStorage',
48354         write: write$2,
48355         read: read$2,
48356         each: each$4,
48357         remove: remove$4,
48358         clearAll: clearAll$2,
48359   };
48360
48361   var storageName = 'storejs';
48362   var doc = Global$3.document;
48363   var _withStorageEl = _makeIEStorageElFunction();
48364   var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
48365
48366   function write$2(unfixedKey, data) {
48367         if (disable) { return }
48368         var fixedKey = fixKey(unfixedKey);
48369         _withStorageEl(function(storageEl) {
48370                 storageEl.setAttribute(fixedKey, data);
48371                 storageEl.save(storageName);
48372         });
48373   }
48374
48375   function read$2(unfixedKey) {
48376         if (disable) { return }
48377         var fixedKey = fixKey(unfixedKey);
48378         var res = null;
48379         _withStorageEl(function(storageEl) {
48380                 res = storageEl.getAttribute(fixedKey);
48381         });
48382         return res
48383   }
48384
48385   function each$4(callback) {
48386         _withStorageEl(function(storageEl) {
48387                 var attributes = storageEl.XMLDocument.documentElement.attributes;
48388                 for (var i=attributes.length-1; i>=0; i--) {
48389                         var attr = attributes[i];
48390                         callback(storageEl.getAttribute(attr.name), attr.name);
48391                 }
48392         });
48393   }
48394
48395   function remove$4(unfixedKey) {
48396         var fixedKey = fixKey(unfixedKey);
48397         _withStorageEl(function(storageEl) {
48398                 storageEl.removeAttribute(fixedKey);
48399                 storageEl.save(storageName);
48400         });
48401   }
48402
48403   function clearAll$2() {
48404         _withStorageEl(function(storageEl) {
48405                 var attributes = storageEl.XMLDocument.documentElement.attributes;
48406                 storageEl.load(storageName);
48407                 for (var i=attributes.length-1; i>=0; i--) {
48408                         storageEl.removeAttribute(attributes[i].name);
48409                 }
48410                 storageEl.save(storageName);
48411         });
48412   }
48413
48414   // Helpers
48415   //////////
48416
48417   // In IE7, keys cannot start with a digit or contain certain chars.
48418   // See https://github.com/marcuswestin/store.js/issues/40
48419   // See https://github.com/marcuswestin/store.js/issues/83
48420   var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
48421   function fixKey(key) {
48422         return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___')
48423   }
48424
48425   function _makeIEStorageElFunction() {
48426         if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
48427                 return null
48428         }
48429         var scriptTag = 'script',
48430                 storageOwner,
48431                 storageContainer,
48432                 storageEl;
48433
48434         // Since #userData storage applies only to specific paths, we need to
48435         // somehow link our data to a specific path.  We choose /favicon.ico
48436         // as a pretty safe option, since all browsers already make a request to
48437         // this URL anyway and being a 404 will not hurt us here.  We wrap an
48438         // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
48439         // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
48440         // since the iframe access rules appear to allow direct access and
48441         // manipulation of the document element, even for a 404 page.  This
48442         // document can be used instead of the current document (which would
48443         // have been limited to the current path) to perform #userData storage.
48444         try {
48445                 /* global ActiveXObject */
48446                 storageContainer = new ActiveXObject('htmlfile');
48447                 storageContainer.open();
48448                 storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>');
48449                 storageContainer.close();
48450                 storageOwner = storageContainer.w.frames[0].document;
48451                 storageEl = storageOwner.createElement('div');
48452         } catch(e) {
48453                 // somehow ActiveXObject instantiation failed (perhaps some special
48454                 // security settings or otherwse), fall back to per-path storage
48455                 storageEl = doc.createElement('div');
48456                 storageOwner = doc.body;
48457         }
48458
48459         return function(storeFunction) {
48460                 var args = [].slice.call(arguments, 0);
48461                 args.unshift(storageEl);
48462                 // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
48463                 // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
48464                 storageOwner.appendChild(storageEl);
48465                 storageEl.addBehavior('#default#userData');
48466                 storageEl.load(storageName);
48467                 storeFunction.apply(this, args);
48468                 storageOwner.removeChild(storageEl);
48469                 return
48470         }
48471   }
48472
48473   // cookieStorage is useful Safari private browser mode, where localStorage
48474   // doesn't work but cookies do. This implementation is adopted from
48475   // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
48476
48477
48478   var Global$4 = util.Global;
48479   var trim$1 = util.trim;
48480
48481   var cookieStorage = {
48482         name: 'cookieStorage',
48483         read: read$3,
48484         write: write$3,
48485         each: each$5,
48486         remove: remove$5,
48487         clearAll: clearAll$3,
48488   };
48489
48490   var doc$1 = Global$4.document;
48491
48492   function read$3(key) {
48493         if (!key || !_has(key)) { return null }
48494         var regexpStr = "(?:^|.*;\\s*)" +
48495                 escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
48496                 "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
48497         return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1"))
48498   }
48499
48500   function each$5(callback) {
48501         var cookies = doc$1.cookie.split(/; ?/g);
48502         for (var i = cookies.length - 1; i >= 0; i--) {
48503                 if (!trim$1(cookies[i])) {
48504                         continue
48505                 }
48506                 var kvp = cookies[i].split('=');
48507                 var key = unescape(kvp[0]);
48508                 var val = unescape(kvp[1]);
48509                 callback(val, key);
48510         }
48511   }
48512
48513   function write$3(key, data) {
48514         if(!key) { return }
48515         doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
48516   }
48517
48518   function remove$5(key) {
48519         if (!key || !_has(key)) {
48520                 return
48521         }
48522         doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
48523   }
48524
48525   function clearAll$3() {
48526         each$5(function(_, key) {
48527                 remove$5(key);
48528         });
48529   }
48530
48531   function _has(key) {
48532         return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
48533   }
48534
48535   var Global$5 = util.Global;
48536
48537   var sessionStorage_1 = {
48538         name: 'sessionStorage',
48539         read: read$4,
48540         write: write$4,
48541         each: each$6,
48542         remove: remove$6,
48543         clearAll: clearAll$4
48544   };
48545
48546   function sessionStorage() {
48547         return Global$5.sessionStorage
48548   }
48549
48550   function read$4(key) {
48551         return sessionStorage().getItem(key)
48552   }
48553
48554   function write$4(key, data) {
48555         return sessionStorage().setItem(key, data)
48556   }
48557
48558   function each$6(fn) {
48559         for (var i = sessionStorage().length - 1; i >= 0; i--) {
48560                 var key = sessionStorage().key(i);
48561                 fn(read$4(key), key);
48562         }
48563   }
48564
48565   function remove$6(key) {
48566         return sessionStorage().removeItem(key)
48567   }
48568
48569   function clearAll$4() {
48570         return sessionStorage().clear()
48571   }
48572
48573   // memoryStorage is a useful last fallback to ensure that the store
48574   // is functions (meaning store.get(), store.set(), etc will all function).
48575   // However, stored values will not persist when the browser navigates to
48576   // a new page or reloads the current page.
48577
48578   var memoryStorage_1 = {
48579         name: 'memoryStorage',
48580         read: read$5,
48581         write: write$5,
48582         each: each$7,
48583         remove: remove$7,
48584         clearAll: clearAll$5,
48585   };
48586
48587   var memoryStorage = {};
48588
48589   function read$5(key) {
48590         return memoryStorage[key]
48591   }
48592
48593   function write$5(key, data) {
48594         memoryStorage[key] = data;
48595   }
48596
48597   function each$7(callback) {
48598         for (var key in memoryStorage) {
48599                 if (memoryStorage.hasOwnProperty(key)) {
48600                         callback(memoryStorage[key], key);
48601                 }
48602         }
48603   }
48604
48605   function remove$7(key) {
48606         delete memoryStorage[key];
48607   }
48608
48609   function clearAll$5(key) {
48610         memoryStorage = {};
48611   }
48612
48613   var all = [
48614         // Listed in order of usage preference
48615         localStorage_1,
48616         oldFFGlobalStorage,
48617         oldIEUserDataStorage,
48618         cookieStorage,
48619         sessionStorage_1,
48620         memoryStorage_1
48621   ];
48622
48623   /* eslint-disable */
48624
48625   //  json2.js
48626   //  2016-10-28
48627   //  Public Domain.
48628   //  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
48629   //  See http://www.JSON.org/js.html
48630   //  This code should be minified before deployment.
48631   //  See http://javascript.crockford.com/jsmin.html
48632
48633   //  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
48634   //  NOT CONTROL.
48635
48636   //  This file creates a global JSON object containing two methods: stringify
48637   //  and parse. This file provides the ES5 JSON capability to ES3 systems.
48638   //  If a project might run on IE8 or earlier, then this file should be included.
48639   //  This file does nothing on ES5 systems.
48640
48641   //      JSON.stringify(value, replacer, space)
48642   //          value       any JavaScript value, usually an object or array.
48643   //          replacer    an optional parameter that determines how object
48644   //                      values are stringified for objects. It can be a
48645   //                      function or an array of strings.
48646   //          space       an optional parameter that specifies the indentation
48647   //                      of nested structures. If it is omitted, the text will
48648   //                      be packed without extra whitespace. If it is a number,
48649   //                      it will specify the number of spaces to indent at each
48650   //                      level. If it is a string (such as "\t" or "&nbsp;"),
48651   //                      it contains the characters used to indent at each level.
48652   //          This method produces a JSON text from a JavaScript value.
48653   //          When an object value is found, if the object contains a toJSON
48654   //          method, its toJSON method will be called and the result will be
48655   //          stringified. A toJSON method does not serialize: it returns the
48656   //          value represented by the name/value pair that should be serialized,
48657   //          or undefined if nothing should be serialized. The toJSON method
48658   //          will be passed the key associated with the value, and this will be
48659   //          bound to the value.
48660
48661   //          For example, this would serialize Dates as ISO strings.
48662
48663   //              Date.prototype.toJSON = function (key) {
48664   //                  function f(n) {
48665   //                      // Format integers to have at least two digits.
48666   //                      return (n < 10)
48667   //                          ? "0" + n
48668   //                          : n;
48669   //                  }
48670   //                  return this.getUTCFullYear()   + "-" +
48671   //                       f(this.getUTCMonth() + 1) + "-" +
48672   //                       f(this.getUTCDate())      + "T" +
48673   //                       f(this.getUTCHours())     + ":" +
48674   //                       f(this.getUTCMinutes())   + ":" +
48675   //                       f(this.getUTCSeconds())   + "Z";
48676   //              };
48677
48678   //          You can provide an optional replacer method. It will be passed the
48679   //          key and value of each member, with this bound to the containing
48680   //          object. The value that is returned from your method will be
48681   //          serialized. If your method returns undefined, then the member will
48682   //          be excluded from the serialization.
48683
48684   //          If the replacer parameter is an array of strings, then it will be
48685   //          used to select the members to be serialized. It filters the results
48686   //          such that only members with keys listed in the replacer array are
48687   //          stringified.
48688
48689   //          Values that do not have JSON representations, such as undefined or
48690   //          functions, will not be serialized. Such values in objects will be
48691   //          dropped; in arrays they will be replaced with null. You can use
48692   //          a replacer function to replace those with JSON values.
48693
48694   //          JSON.stringify(undefined) returns undefined.
48695
48696   //          The optional space parameter produces a stringification of the
48697   //          value that is filled with line breaks and indentation to make it
48698   //          easier to read.
48699
48700   //          If the space parameter is a non-empty string, then that string will
48701   //          be used for indentation. If the space parameter is a number, then
48702   //          the indentation will be that many spaces.
48703
48704   //          Example:
48705
48706   //          text = JSON.stringify(["e", {pluribus: "unum"}]);
48707   //          // text is '["e",{"pluribus":"unum"}]'
48708
48709   //          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
48710   //          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
48711
48712   //          text = JSON.stringify([new Date()], function (key, value) {
48713   //              return this[key] instanceof Date
48714   //                  ? "Date(" + this[key] + ")"
48715   //                  : value;
48716   //          });
48717   //          // text is '["Date(---current time---)"]'
48718
48719   //      JSON.parse(text, reviver)
48720   //          This method parses a JSON text to produce an object or array.
48721   //          It can throw a SyntaxError exception.
48722
48723   //          The optional reviver parameter is a function that can filter and
48724   //          transform the results. It receives each of the keys and values,
48725   //          and its return value is used instead of the original value.
48726   //          If it returns what it received, then the structure is not modified.
48727   //          If it returns undefined then the member is deleted.
48728
48729   //          Example:
48730
48731   //          // Parse the text. Values that look like ISO date strings will
48732   //          // be converted to Date objects.
48733
48734   //          myData = JSON.parse(text, function (key, value) {
48735   //              var a;
48736   //              if (typeof value === "string") {
48737   //                  a =
48738   //   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
48739   //                  if (a) {
48740   //                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
48741   //                          +a[5], +a[6]));
48742   //                  }
48743   //              }
48744   //              return value;
48745   //          });
48746
48747   //          myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
48748   //              var d;
48749   //              if (typeof value === "string" &&
48750   //                      value.slice(0, 5) === "Date(" &&
48751   //                      value.slice(-1) === ")") {
48752   //                  d = new Date(value.slice(5, -1));
48753   //                  if (d) {
48754   //                      return d;
48755   //                  }
48756   //              }
48757   //              return value;
48758   //          });
48759
48760   //  This is a reference implementation. You are free to copy, modify, or
48761   //  redistribute.
48762
48763   /*jslint
48764       eval, for, this
48765   */
48766
48767   /*property
48768       JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
48769       getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
48770       lastIndex, length, parse, prototype, push, replace, slice, stringify,
48771       test, toJSON, toString, valueOf
48772   */
48773
48774
48775   // Create a JSON object only if one does not already exist. We create the
48776   // methods in a closure to avoid creating global variables.
48777
48778   if (typeof JSON !== "object") {
48779       JSON = {};
48780   }
48781
48782   (function () {
48783
48784       var rx_one = /^[\],:{}\s]*$/;
48785       var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
48786       var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
48787       var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
48788       var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
48789       var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
48790
48791       function f(n) {
48792           // Format integers to have at least two digits.
48793           return n < 10
48794               ? "0" + n
48795               : n;
48796       }
48797
48798       function this_value() {
48799           return this.valueOf();
48800       }
48801
48802       if (typeof Date.prototype.toJSON !== "function") {
48803
48804           Date.prototype.toJSON = function () {
48805
48806               return isFinite(this.valueOf())
48807                   ? this.getUTCFullYear() + "-" +
48808                           f(this.getUTCMonth() + 1) + "-" +
48809                           f(this.getUTCDate()) + "T" +
48810                           f(this.getUTCHours()) + ":" +
48811                           f(this.getUTCMinutes()) + ":" +
48812                           f(this.getUTCSeconds()) + "Z"
48813                   : null;
48814           };
48815
48816           Boolean.prototype.toJSON = this_value;
48817           Number.prototype.toJSON = this_value;
48818           String.prototype.toJSON = this_value;
48819       }
48820
48821       var gap;
48822       var indent;
48823       var meta;
48824       var rep;
48825
48826
48827       function quote(string) {
48828
48829   // If the string contains no control characters, no quote characters, and no
48830   // backslash characters, then we can safely slap some quotes around it.
48831   // Otherwise we must also replace the offending characters with safe escape
48832   // sequences.
48833
48834           rx_escapable.lastIndex = 0;
48835           return rx_escapable.test(string)
48836               ? "\"" + string.replace(rx_escapable, function (a) {
48837                   var c = meta[a];
48838                   return typeof c === "string"
48839                       ? c
48840                       : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
48841               }) + "\""
48842               : "\"" + string + "\"";
48843       }
48844
48845
48846       function str(key, holder) {
48847
48848   // Produce a string from holder[key].
48849
48850           var i;          // The loop counter.
48851           var k;          // The member key.
48852           var v;          // The member value.
48853           var length;
48854           var mind = gap;
48855           var partial;
48856           var value = holder[key];
48857
48858   // If the value has a toJSON method, call it to obtain a replacement value.
48859
48860           if (value && typeof value === "object" &&
48861                   typeof value.toJSON === "function") {
48862               value = value.toJSON(key);
48863           }
48864
48865   // If we were called with a replacer function, then call the replacer to
48866   // obtain a replacement value.
48867
48868           if (typeof rep === "function") {
48869               value = rep.call(holder, key, value);
48870           }
48871
48872   // What happens next depends on the value's type.
48873
48874           switch (typeof value) {
48875           case "string":
48876               return quote(value);
48877
48878           case "number":
48879
48880   // JSON numbers must be finite. Encode non-finite numbers as null.
48881
48882               return isFinite(value)
48883                   ? String(value)
48884                   : "null";
48885
48886           case "boolean":
48887           case "null":
48888
48889   // If the value is a boolean or null, convert it to a string. Note:
48890   // typeof null does not produce "null". The case is included here in
48891   // the remote chance that this gets fixed someday.
48892
48893               return String(value);
48894
48895   // If the type is "object", we might be dealing with an object or an array or
48896   // null.
48897
48898           case "object":
48899
48900   // Due to a specification blunder in ECMAScript, typeof null is "object",
48901   // so watch out for that case.
48902
48903               if (!value) {
48904                   return "null";
48905               }
48906
48907   // Make an array to hold the partial results of stringifying this object value.
48908
48909               gap += indent;
48910               partial = [];
48911
48912   // Is the value an array?
48913
48914               if (Object.prototype.toString.apply(value) === "[object Array]") {
48915
48916   // The value is an array. Stringify every element. Use null as a placeholder
48917   // for non-JSON values.
48918
48919                   length = value.length;
48920                   for (i = 0; i < length; i += 1) {
48921                       partial[i] = str(i, value) || "null";
48922                   }
48923
48924   // Join all of the elements together, separated with commas, and wrap them in
48925   // brackets.
48926
48927                   v = partial.length === 0
48928                       ? "[]"
48929                       : gap
48930                           ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
48931                           : "[" + partial.join(",") + "]";
48932                   gap = mind;
48933                   return v;
48934               }
48935
48936   // If the replacer is an array, use it to select the members to be stringified.
48937
48938               if (rep && typeof rep === "object") {
48939                   length = rep.length;
48940                   for (i = 0; i < length; i += 1) {
48941                       if (typeof rep[i] === "string") {
48942                           k = rep[i];
48943                           v = str(k, value);
48944                           if (v) {
48945                               partial.push(quote(k) + (
48946                                   gap
48947                                       ? ": "
48948                                       : ":"
48949                               ) + v);
48950                           }
48951                       }
48952                   }
48953               } else {
48954
48955   // Otherwise, iterate through all of the keys in the object.
48956
48957                   for (k in value) {
48958                       if (Object.prototype.hasOwnProperty.call(value, k)) {
48959                           v = str(k, value);
48960                           if (v) {
48961                               partial.push(quote(k) + (
48962                                   gap
48963                                       ? ": "
48964                                       : ":"
48965                               ) + v);
48966                           }
48967                       }
48968                   }
48969               }
48970
48971   // Join all of the member texts together, separated with commas,
48972   // and wrap them in braces.
48973
48974               v = partial.length === 0
48975                   ? "{}"
48976                   : gap
48977                       ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
48978                       : "{" + partial.join(",") + "}";
48979               gap = mind;
48980               return v;
48981           }
48982       }
48983
48984   // If the JSON object does not yet have a stringify method, give it one.
48985
48986       if (typeof JSON.stringify !== "function") {
48987           meta = {    // table of character substitutions
48988               "\b": "\\b",
48989               "\t": "\\t",
48990               "\n": "\\n",
48991               "\f": "\\f",
48992               "\r": "\\r",
48993               "\"": "\\\"",
48994               "\\": "\\\\"
48995           };
48996           JSON.stringify = function (value, replacer, space) {
48997
48998   // The stringify method takes a value and an optional replacer, and an optional
48999   // space parameter, and returns a JSON text. The replacer can be a function
49000   // that can replace values, or an array of strings that will select the keys.
49001   // A default replacer method can be provided. Use of the space parameter can
49002   // produce text that is more easily readable.
49003
49004               var i;
49005               gap = "";
49006               indent = "";
49007
49008   // If the space parameter is a number, make an indent string containing that
49009   // many spaces.
49010
49011               if (typeof space === "number") {
49012                   for (i = 0; i < space; i += 1) {
49013                       indent += " ";
49014                   }
49015
49016   // If the space parameter is a string, it will be used as the indent string.
49017
49018               } else if (typeof space === "string") {
49019                   indent = space;
49020               }
49021
49022   // If there is a replacer, it must be a function or an array.
49023   // Otherwise, throw an error.
49024
49025               rep = replacer;
49026               if (replacer && typeof replacer !== "function" &&
49027                       (typeof replacer !== "object" ||
49028                       typeof replacer.length !== "number")) {
49029                   throw new Error("JSON.stringify");
49030               }
49031
49032   // Make a fake root object containing our value under the key of "".
49033   // Return the result of stringifying the value.
49034
49035               return str("", {"": value});
49036           };
49037       }
49038
49039
49040   // If the JSON object does not yet have a parse method, give it one.
49041
49042       if (typeof JSON.parse !== "function") {
49043           JSON.parse = function (text, reviver) {
49044
49045   // The parse method takes a text and an optional reviver function, and returns
49046   // a JavaScript value if the text is a valid JSON text.
49047
49048               var j;
49049
49050               function walk(holder, key) {
49051
49052   // The walk method is used to recursively walk the resulting structure so
49053   // that modifications can be made.
49054
49055                   var k;
49056                   var v;
49057                   var value = holder[key];
49058                   if (value && typeof value === "object") {
49059                       for (k in value) {
49060                           if (Object.prototype.hasOwnProperty.call(value, k)) {
49061                               v = walk(value, k);
49062                               if (v !== undefined) {
49063                                   value[k] = v;
49064                               } else {
49065                                   delete value[k];
49066                               }
49067                           }
49068                       }
49069                   }
49070                   return reviver.call(holder, key, value);
49071               }
49072
49073
49074   // Parsing happens in four stages. In the first stage, we replace certain
49075   // Unicode characters with escape sequences. JavaScript handles many characters
49076   // incorrectly, either silently deleting them, or treating them as line endings.
49077
49078               text = String(text);
49079               rx_dangerous.lastIndex = 0;
49080               if (rx_dangerous.test(text)) {
49081                   text = text.replace(rx_dangerous, function (a) {
49082                       return "\\u" +
49083                               ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
49084                   });
49085               }
49086
49087   // In the second stage, we run the text against regular expressions that look
49088   // for non-JSON patterns. We are especially concerned with "()" and "new"
49089   // because they can cause invocation, and "=" because it can cause mutation.
49090   // But just to be safe, we want to reject all unexpected forms.
49091
49092   // We split the second stage into 4 regexp operations in order to work around
49093   // crippling inefficiencies in IE's and Safari's regexp engines. First we
49094   // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
49095   // replace all simple value tokens with "]" characters. Third, we delete all
49096   // open brackets that follow a colon or comma or that begin the text. Finally,
49097   // we look to see that the remaining characters are only whitespace or "]" or
49098   // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
49099
49100               if (
49101                   rx_one.test(
49102                       text
49103                           .replace(rx_two, "@")
49104                           .replace(rx_three, "]")
49105                           .replace(rx_four, "")
49106                   )
49107               ) {
49108
49109   // In the third stage we use the eval function to compile the text into a
49110   // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
49111   // in JavaScript: it can begin a block or an object literal. We wrap the text
49112   // in parens to eliminate the ambiguity.
49113
49114                   j = eval("(" + text + ")");
49115
49116   // In the optional fourth stage, we recursively walk the new structure, passing
49117   // each name/value pair to a reviver function for possible transformation.
49118
49119                   return (typeof reviver === "function")
49120                       ? walk({"": j}, "")
49121                       : j;
49122               }
49123
49124   // If the text is not JSON parseable, then a SyntaxError is thrown.
49125
49126               throw new SyntaxError("JSON.parse");
49127           };
49128       }
49129   }());
49130
49131   var json2 = json2Plugin;
49132
49133   function json2Plugin() {
49134         
49135         return {}
49136   }
49137
49138   var plugins = [json2];
49139
49140   var store_legacy = storeEngine.createStore(all, plugins);
49141
49142   // # osm-auth
49143   //
49144   // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
49145   // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
49146   // does not support custom headers, which this uses everywhere.
49147   var osmAuth = function(o) {
49148
49149       var oauth = {};
49150
49151       // authenticated users will also have a request token secret, but it's
49152       // not used in transactions with the server
49153       oauth.authenticated = function() {
49154           return !!(token('oauth_token') && token('oauth_token_secret'));
49155       };
49156
49157       oauth.logout = function() {
49158           token('oauth_token', '');
49159           token('oauth_token_secret', '');
49160           token('oauth_request_token_secret', '');
49161           return oauth;
49162       };
49163
49164       // TODO: detect lack of click event
49165       oauth.authenticate = function(callback) {
49166           if (oauth.authenticated()) return callback();
49167
49168           oauth.logout();
49169
49170           // ## Getting a request token
49171           var params = timenonce(getAuth(o)),
49172               url = o.url + '/oauth/request_token';
49173
49174           params.oauth_signature = ohauth_1.signature(
49175               o.oauth_secret, '',
49176               ohauth_1.baseString('POST', url, params));
49177
49178           if (!o.singlepage) {
49179               // Create a 600x550 popup window in the center of the screen
49180               var w = 600, h = 550,
49181                   settings = [
49182                       ['width', w], ['height', h],
49183                       ['left', screen.width / 2 - w / 2],
49184                       ['top', screen.height / 2 - h / 2]].map(function(x) {
49185                           return x.join('=');
49186                       }).join(','),
49187                   popup = window.open('about:blank', 'oauth_window', settings);
49188           }
49189
49190           // Request a request token. When this is complete, the popup
49191           // window is redirected to OSM's authorization page.
49192           ohauth_1.xhr('POST', url, params, null, {}, reqTokenDone);
49193           o.loading();
49194
49195           function reqTokenDone(err, xhr) {
49196               o.done();
49197               if (err) return callback(err);
49198               var resp = ohauth_1.stringQs(xhr.response);
49199               token('oauth_request_token_secret', resp.oauth_token_secret);
49200               var authorize_url = o.url + '/oauth/authorize?' + ohauth_1.qsString({
49201                   oauth_token: resp.oauth_token,
49202                   oauth_callback: resolveUrl(o.landing)
49203               });
49204
49205               if (o.singlepage) {
49206                   location.href = authorize_url;
49207               } else {
49208                   popup.location = authorize_url;
49209               }
49210           }
49211
49212           // Called by a function in a landing page, in the popup window. The
49213           // window closes itself.
49214           window.authComplete = function(token) {
49215               var oauth_token = ohauth_1.stringQs(token.split('?')[1]);
49216               get_access_token(oauth_token.oauth_token);
49217               delete window.authComplete;
49218           };
49219
49220           // ## Getting an request token
49221           //
49222           // At this point we have an `oauth_token`, brought in from a function
49223           // call on a landing page popup.
49224           function get_access_token(oauth_token) {
49225               var url = o.url + '/oauth/access_token',
49226                   params = timenonce(getAuth(o)),
49227                   request_token_secret = token('oauth_request_token_secret');
49228               params.oauth_token = oauth_token;
49229               params.oauth_signature = ohauth_1.signature(
49230                   o.oauth_secret,
49231                   request_token_secret,
49232                   ohauth_1.baseString('POST', url, params));
49233
49234               // ## Getting an access token
49235               //
49236               // The final token required for authentication. At this point
49237               // we have a `request token secret`
49238               ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
49239               o.loading();
49240           }
49241
49242           function accessTokenDone(err, xhr) {
49243               o.done();
49244               if (err) return callback(err);
49245               var access_token = ohauth_1.stringQs(xhr.response);
49246               token('oauth_token', access_token.oauth_token);
49247               token('oauth_token_secret', access_token.oauth_token_secret);
49248               callback(null, oauth);
49249           }
49250       };
49251
49252       oauth.bootstrapToken = function(oauth_token, callback) {
49253           // ## Getting an request token
49254           // At this point we have an `oauth_token`, brought in from a function
49255           // call on a landing page popup.
49256           function get_access_token(oauth_token) {
49257               var url = o.url + '/oauth/access_token',
49258                   params = timenonce(getAuth(o)),
49259                   request_token_secret = token('oauth_request_token_secret');
49260               params.oauth_token = oauth_token;
49261               params.oauth_signature = ohauth_1.signature(
49262                   o.oauth_secret,
49263                   request_token_secret,
49264                   ohauth_1.baseString('POST', url, params));
49265
49266               // ## Getting an access token
49267               // The final token required for authentication. At this point
49268               // we have a `request token secret`
49269               ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
49270               o.loading();
49271           }
49272
49273           function accessTokenDone(err, xhr) {
49274               o.done();
49275               if (err) return callback(err);
49276               var access_token = ohauth_1.stringQs(xhr.response);
49277               token('oauth_token', access_token.oauth_token);
49278               token('oauth_token_secret', access_token.oauth_token_secret);
49279               callback(null, oauth);
49280           }
49281
49282           get_access_token(oauth_token);
49283       };
49284
49285       // # xhr
49286       //
49287       // A single XMLHttpRequest wrapper that does authenticated calls if the
49288       // user has logged in.
49289       oauth.xhr = function(options, callback) {
49290           if (!oauth.authenticated()) {
49291               if (o.auto) {
49292                   return oauth.authenticate(run);
49293               } else {
49294                   callback('not authenticated', null);
49295                   return;
49296               }
49297           } else {
49298               return run();
49299           }
49300
49301           function run() {
49302               var params = timenonce(getAuth(o)),
49303                   oauth_token_secret = token('oauth_token_secret'),
49304                   url = (options.prefix !== false) ? o.url + options.path : options.path,
49305                   url_parts = url.replace(/#.*$/, '').split('?', 2),
49306                   base_url = url_parts[0],
49307                   query = (url_parts.length === 2) ? url_parts[1] : '';
49308
49309               // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
49310               if ((!options.options || !options.options.header ||
49311                   options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
49312                   options.content) {
49313                   params = immutable(params, ohauth_1.stringQs(options.content));
49314               }
49315
49316               params.oauth_token = token('oauth_token');
49317               params.oauth_signature = ohauth_1.signature(
49318                   o.oauth_secret,
49319                   oauth_token_secret,
49320                   ohauth_1.baseString(options.method, base_url, immutable(params, ohauth_1.stringQs(query)))
49321               );
49322
49323               return ohauth_1.xhr(options.method, url, params, options.content, options.options, done);
49324           }
49325
49326           function done(err, xhr) {
49327               if (err) return callback(err);
49328               else if (xhr.responseXML) return callback(err, xhr.responseXML);
49329               else return callback(err, xhr.response);
49330           }
49331       };
49332
49333       // pre-authorize this object, if we can just get a token and token_secret
49334       // from the start
49335       oauth.preauth = function(c) {
49336           if (!c) return;
49337           if (c.oauth_token) token('oauth_token', c.oauth_token);
49338           if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
49339           return oauth;
49340       };
49341
49342       oauth.options = function(_) {
49343           if (!arguments.length) return o;
49344
49345           o = _;
49346           o.url = o.url || 'https://www.openstreetmap.org';
49347           o.landing = o.landing || 'land.html';
49348           o.singlepage = o.singlepage || false;
49349
49350           // Optional loading and loading-done functions for nice UI feedback.
49351           // by default, no-ops
49352           o.loading = o.loading || function() {};
49353           o.done = o.done || function() {};
49354
49355           return oauth.preauth(o);
49356       };
49357
49358       // 'stamp' an authentication object from `getAuth()`
49359       // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
49360       // and timestamp
49361       function timenonce(o) {
49362           o.oauth_timestamp = ohauth_1.timestamp();
49363           o.oauth_nonce = ohauth_1.nonce();
49364           return o;
49365       }
49366
49367       // get/set tokens. These are prefixed with the base URL so that `osm-auth`
49368       // can be used with multiple APIs and the keys in `localStorage`
49369       // will not clash
49370       var token;
49371
49372       if (store_legacy.enabled) {
49373           token = function (x, y) {
49374               if (arguments.length === 1) return store_legacy.get(o.url + x);
49375               else if (arguments.length === 2) return store_legacy.set(o.url + x, y);
49376           };
49377       } else {
49378           var storage = {};
49379           token = function (x, y) {
49380               if (arguments.length === 1) return storage[o.url + x];
49381               else if (arguments.length === 2) return storage[o.url + x] = y;
49382           };
49383       }
49384
49385       // Get an authentication object. If you just add and remove properties
49386       // from a single object, you'll need to use `delete` to make sure that
49387       // it doesn't contain undesired properties for authentication
49388       function getAuth(o) {
49389           return {
49390               oauth_consumer_key: o.oauth_consumer_key,
49391               oauth_signature_method: 'HMAC-SHA1'
49392           };
49393       }
49394
49395       // potentially pre-authorize
49396       oauth.options(o);
49397
49398       return oauth;
49399   };
49400
49401   var JXON = new (function () {
49402     var
49403       sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */
49404       aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
49405
49406     function parseText (sValue) {
49407       if (rIsNull.test(sValue)) { return null; }
49408       if (rIsBool.test(sValue)) { return sValue.toLowerCase() === 'true'; }
49409       if (isFinite(sValue)) { return parseFloat(sValue); }
49410       if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
49411       return sValue;
49412     }
49413
49414     function EmptyTree () { }
49415     EmptyTree.prototype.toString = function () { return 'null'; };
49416     EmptyTree.prototype.valueOf = function () { return null; };
49417
49418     function objectify (vValue) {
49419       return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
49420     }
49421
49422     function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
49423       var
49424         nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
49425         bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
49426
49427       var
49428         sProp, vContent, nLength = 0, sCollectedTxt = '',
49429         vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
49430
49431       if (bChildren) {
49432         for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
49433           oNode = oParentNode.childNodes.item(nItem);
49434           if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is 'CDATASection' (4) */
49435           else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is 'Text' (3) */
49436           else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is 'Element' (1) */
49437         }
49438       }
49439
49440       var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
49441
49442       if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
49443
49444       for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
49445         sProp = aCache[nElId].nodeName.toLowerCase();
49446         vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
49447         if (vResult.hasOwnProperty(sProp)) {
49448           if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
49449           vResult[sProp].push(vContent);
49450         } else {
49451           vResult[sProp] = vContent;
49452           nLength++;
49453         }
49454       }
49455
49456       if (bAttributes) {
49457         var
49458           nAttrLen = oParentNode.attributes.length,
49459           sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
49460
49461         for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
49462           oAttrib = oParentNode.attributes.item(nAttrib);
49463           oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
49464         }
49465
49466         if (bNesteAttr) {
49467           if (bFreeze) { Object.freeze(oAttrParent); }
49468           vResult[sAttributesProp] = oAttrParent;
49469           nLength -= nAttrLen - 1;
49470         }
49471       }
49472
49473       if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
49474         vResult[sValueProp] = vBuiltVal;
49475       } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
49476         vResult = vBuiltVal;
49477       }
49478
49479       if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
49480
49481       aCache.length = nLevelStart;
49482
49483       return vResult;
49484     }
49485
49486     function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
49487       var vValue, oChild;
49488
49489       if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
49490         oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
49491       } else if (oParentObj.constructor === Date) {
49492         oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));    
49493       }
49494
49495       for (var sName in oParentObj) {
49496         vValue = oParentObj[sName];
49497         if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
49498         if (sName === sValueProp) {
49499           if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
49500         } else if (sName === sAttributesProp) { /* verbosity level is 3 */
49501           for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
49502         } else if (sName.charAt(0) === sAttrPref) {
49503           oParentEl.setAttribute(sName.slice(1), vValue);
49504         } else if (vValue.constructor === Array) {
49505           for (var nItem = 0; nItem < vValue.length; nItem++) {
49506             oChild = oXMLDoc.createElement(sName);
49507             loadObjTree(oXMLDoc, oChild, vValue[nItem]);
49508             oParentEl.appendChild(oChild);
49509           }
49510         } else {
49511           oChild = oXMLDoc.createElement(sName);
49512           if (vValue instanceof Object) {
49513             loadObjTree(oXMLDoc, oChild, vValue);
49514           } else if (vValue !== null && vValue !== true) {
49515             oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
49516           }
49517           oParentEl.appendChild(oChild);
49518        }
49519      }
49520     }
49521
49522     this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
49523       var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
49524       return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);    
49525     };
49526
49527     this.unbuild = function (oObjTree) {    
49528       var oNewDoc = document.implementation.createDocument('', '', null);
49529       loadObjTree(oNewDoc, oNewDoc, oObjTree);
49530       return oNewDoc;
49531     };
49532
49533     this.stringify = function (oObjTree) {
49534       return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
49535     };
49536   })();
49537
49538   // var myObject = JXON.build(doc);
49539   // we got our javascript object! try: alert(JSON.stringify(myObject));
49540
49541   // var newDoc = JXON.unbuild(myObject);
49542   // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
49543
49544   var tiler$4 = utilTiler();
49545   var dispatch$5 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded', 'loadedNotes');
49546   var urlroot = 'https://www.openstreetmap.org';
49547   var oauth = osmAuth({
49548       url: urlroot,
49549       oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
49550       oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
49551       loading: authLoading,
49552       done: authDone
49553   });
49554
49555   var _blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
49556   var _tileCache = { loaded: {}, inflight: {}, seen: {} };
49557   var _noteCache = { loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: rbush_1() };
49558   var _userCache = { toLoad: {}, user: {} };
49559   var _changeset = {};
49560
49561   var _connectionID = 1;
49562   var _tileZoom = 16;
49563   var _noteZoom = 12;
49564   var _rateLimitError;
49565   var _userChangesets;
49566   var _userDetails;
49567   var _off;
49568
49569
49570   function authLoading() {
49571       dispatch$5.call('authLoading');
49572   }
49573
49574
49575   function authDone() {
49576       dispatch$5.call('authDone');
49577   }
49578
49579
49580   function abortRequest$4(i) {
49581       if (i) {
49582           i.abort();
49583       }
49584   }
49585
49586
49587   function abortUnwantedRequests$2(cache, tiles) {
49588       forEach(cache.inflight, function(v, k) {
49589           var wanted = find$1(tiles, function(tile) { return k === tile.id; });
49590           if (!wanted) {
49591               abortRequest$4(v);
49592               delete cache.inflight[k];
49593           }
49594       });
49595   }
49596
49597
49598   function getLoc(attrs) {
49599       var lon = attrs.lon && attrs.lon.value;
49600       var lat = attrs.lat && attrs.lat.value;
49601       return [parseFloat(lon), parseFloat(lat)];
49602   }
49603
49604
49605   function getNodes(obj) {
49606       var elems = obj.getElementsByTagName('nd');
49607       var nodes = new Array(elems.length);
49608       for (var i = 0, l = elems.length; i < l; i++) {
49609           nodes[i] = 'n' + elems[i].attributes.ref.value;
49610       }
49611       return nodes;
49612   }
49613
49614
49615   function getTags(obj) {
49616       var elems = obj.getElementsByTagName('tag');
49617       var tags = {};
49618       for (var i = 0, l = elems.length; i < l; i++) {
49619           var attrs = elems[i].attributes;
49620           tags[attrs.k.value] = attrs.v.value;
49621       }
49622
49623       return tags;
49624   }
49625
49626
49627   function getMembers(obj) {
49628       var elems = obj.getElementsByTagName('member');
49629       var members = new Array(elems.length);
49630       for (var i = 0, l = elems.length; i < l; i++) {
49631           var attrs = elems[i].attributes;
49632           members[i] = {
49633               id: attrs.type.value[0] + attrs.ref.value,
49634               type: attrs.type.value,
49635               role: attrs.role.value
49636           };
49637       }
49638       return members;
49639   }
49640
49641
49642   function getVisible(attrs) {
49643       return (!attrs.visible || attrs.visible.value !== 'false');
49644   }
49645
49646
49647   function parseComments(comments) {
49648       var parsedComments = [];
49649
49650       // for each comment
49651       for (var i = 0; i < comments.length; i++) {
49652           var comment = comments[i];
49653           if (comment.nodeName === 'comment') {
49654               var childNodes = comment.childNodes;
49655               var parsedComment = {};
49656
49657               for (var j = 0; j < childNodes.length; j++) {
49658                   var node = childNodes[j];
49659                   var nodeName = node.nodeName;
49660                   if (nodeName === '#text') continue;
49661                   parsedComment[nodeName] = node.textContent;
49662
49663                   if (nodeName === 'uid') {
49664                       var uid = node.textContent;
49665                       if (uid && !_userCache.user[uid]) {
49666                           _userCache.toLoad[uid] = true;
49667                       }
49668                   }
49669               }
49670
49671               if (parsedComment) {
49672                   parsedComments.push(parsedComment);
49673               }
49674           }
49675       }
49676       return parsedComments;
49677   }
49678
49679
49680   function encodeNoteRtree(note) {
49681       return {
49682           minX: note.loc[0],
49683           minY: note.loc[1],
49684           maxX: note.loc[0],
49685           maxY: note.loc[1],
49686           data: note
49687       };
49688   }
49689
49690
49691   var parsers = {
49692       node: function nodeData(obj, uid) {
49693           var attrs = obj.attributes;
49694           return new osmNode({
49695               id: uid,
49696               visible: getVisible(attrs),
49697               version: attrs.version.value,
49698               changeset: attrs.changeset && attrs.changeset.value,
49699               timestamp: attrs.timestamp && attrs.timestamp.value,
49700               user: attrs.user && attrs.user.value,
49701               uid: attrs.uid && attrs.uid.value,
49702               loc: getLoc(attrs),
49703               tags: getTags(obj)
49704           });
49705       },
49706
49707       way: function wayData(obj, uid) {
49708           var attrs = obj.attributes;
49709           return new osmWay({
49710               id: uid,
49711               visible: getVisible(attrs),
49712               version: attrs.version.value,
49713               changeset: attrs.changeset && attrs.changeset.value,
49714               timestamp: attrs.timestamp && attrs.timestamp.value,
49715               user: attrs.user && attrs.user.value,
49716               uid: attrs.uid && attrs.uid.value,
49717               tags: getTags(obj),
49718               nodes: getNodes(obj),
49719           });
49720       },
49721
49722       relation: function relationData(obj, uid) {
49723           var attrs = obj.attributes;
49724           return new osmRelation({
49725               id: uid,
49726               visible: getVisible(attrs),
49727               version: attrs.version.value,
49728               changeset: attrs.changeset && attrs.changeset.value,
49729               timestamp: attrs.timestamp && attrs.timestamp.value,
49730               user: attrs.user && attrs.user.value,
49731               uid: attrs.uid && attrs.uid.value,
49732               tags: getTags(obj),
49733               members: getMembers(obj)
49734           });
49735       },
49736
49737       note: function parseNote(obj, uid) {
49738           var attrs = obj.attributes;
49739           var childNodes = obj.childNodes;
49740           var props = {};
49741
49742           props.id = uid;
49743           props.loc = getLoc(attrs);
49744
49745           // if notes are coincident, move them apart slightly
49746           var coincident = false;
49747           var epsilon = 0.00001;
49748           do {
49749               if (coincident) {
49750                   props.loc = geoVecAdd(props.loc, [epsilon, epsilon]);
49751               }
49752               var bbox = geoExtent(props.loc).bbox();
49753               coincident = _noteCache.rtree.search(bbox).length;
49754           } while (coincident);
49755
49756           // parse note contents
49757           for (var i = 0; i < childNodes.length; i++) {
49758               var node = childNodes[i];
49759               var nodeName = node.nodeName;
49760               if (nodeName === '#text') continue;
49761
49762               // if the element is comments, parse the comments
49763               if (nodeName === 'comments') {
49764                   props[nodeName] = parseComments(node.childNodes);
49765               } else {
49766                   props[nodeName] = node.textContent;
49767               }
49768           }
49769
49770           var note = new osmNote(props);
49771           var item = encodeNoteRtree(note);
49772           _noteCache.note[note.id] = note;
49773           _noteCache.rtree.insert(item);
49774
49775           return note;
49776       },
49777
49778       user: function parseUser(obj, uid) {
49779           var attrs = obj.attributes;
49780           var user = {
49781               id: uid,
49782               display_name: attrs.display_name && attrs.display_name.value,
49783               account_created: attrs.account_created && attrs.account_created.value,
49784               changesets_count: 0
49785           };
49786
49787           var img = obj.getElementsByTagName('img');
49788           if (img && img[0] && img[0].getAttribute('href')) {
49789               user.image_url = img[0].getAttribute('href');
49790           }
49791
49792           var changesets = obj.getElementsByTagName('changesets');
49793           if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
49794               user.changesets_count = changesets[0].getAttribute('count');
49795           }
49796
49797           _userCache.user[uid] = user;
49798           delete _userCache.toLoad[uid];
49799           return user;
49800       }
49801   };
49802
49803
49804   function parseXML(xml, callback, options) {
49805       options = assignIn({ skipSeen: true }, options);
49806       if (!xml || !xml.childNodes) {
49807           return callback({ message: 'No XML', status: -1 });
49808       }
49809
49810       var root = xml.childNodes[0];
49811       var children = root.childNodes;
49812       utilIdleWorker(children, parseChild, done);
49813
49814
49815       function done(results) {
49816           callback(null, results);
49817       }
49818
49819       function parseChild(child) {
49820           var parser = parsers[child.nodeName];
49821           if (!parser) return null;
49822
49823           var uid;
49824           if (child.nodeName === 'user') {
49825               uid = child.attributes.id.value;
49826               if (options.skipSeen && _userCache.user[uid]) {
49827                   delete _userCache.toLoad[uid];
49828                   return null;
49829               }
49830
49831           } else if (child.nodeName === 'note') {
49832               uid = child.getElementsByTagName('id')[0].textContent;
49833
49834           } else {
49835               uid = osmEntity.id.fromOSM(child.nodeName, child.attributes.id.value);
49836               if (options.skipSeen) {
49837                   if (_tileCache.seen[uid]) return null;  // avoid reparsing a "seen" entity
49838                   _tileCache.seen[uid] = true;
49839               }
49840           }
49841
49842           return parser(child, uid);
49843       }
49844   }
49845
49846
49847   // replace or remove note from rtree
49848   function updateRtree$2(item, replace) {
49849       _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; });
49850
49851       if (replace) {
49852           _noteCache.rtree.insert(item);
49853       }
49854   }
49855
49856
49857   function wrapcb(thisArg, callback, cid) {
49858       return function(err, result) {
49859           if (err) {
49860               // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
49861               if (err.status === 400 || err.status === 401 || err.status === 403) {
49862                   thisArg.logout();
49863               }
49864               return callback.call(thisArg, err);
49865
49866           } else if (thisArg.getConnectionId() !== cid) {
49867               return callback.call(thisArg, { message: 'Connection Switched', status: -1 });
49868
49869           } else {
49870               return callback.call(thisArg, err, result);
49871           }
49872       };
49873   }
49874
49875
49876   var serviceOsm = {
49877
49878       init: function() {
49879           utilRebind(this, dispatch$5, 'on');
49880       },
49881
49882
49883       reset: function() {
49884           _connectionID++;
49885           _userChangesets = undefined;
49886           _userDetails = undefined;
49887           _rateLimitError = undefined;
49888
49889           forEach(_tileCache.inflight, abortRequest$4);
49890           forEach(_noteCache.inflight, abortRequest$4);
49891           forEach(_noteCache.inflightPost, abortRequest$4);
49892           if (_changeset.inflight) abortRequest$4(_changeset.inflight);
49893
49894           _tileCache = { loaded: {}, inflight: {}, seen: {} };
49895           _noteCache = { loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: rbush_1() };
49896           _userCache = { toLoad: {}, user: {} };
49897           _changeset = {};
49898
49899           return this;
49900       },
49901
49902
49903       getConnectionId: function() {
49904           return _connectionID;
49905       },
49906
49907
49908       changesetURL: function(changesetID) {
49909           return urlroot + '/changeset/' + changesetID;
49910       },
49911
49912
49913       changesetsURL: function(center, zoom) {
49914           var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
49915           return urlroot + '/history#map=' +
49916               Math.floor(zoom) + '/' +
49917               center[1].toFixed(precision) + '/' +
49918               center[0].toFixed(precision);
49919       },
49920
49921
49922       entityURL: function(entity) {
49923           return urlroot + '/' + entity.type + '/' + entity.osmId();
49924       },
49925
49926
49927       historyURL: function(entity) {
49928           return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
49929       },
49930
49931
49932       userURL: function(username) {
49933           return urlroot + '/user/' + username;
49934       },
49935
49936
49937       noteURL: function(note) {
49938           return urlroot + '/note/' + note.id;
49939       },
49940
49941
49942       noteReportURL: function(note) {
49943           return urlroot + '/reports/new?reportable_type=Note&reportable_id=' + note.id;
49944       },
49945
49946
49947       // Generic method to load data from the OSM API
49948       // Can handle either auth or unauth calls.
49949       loadFromAPI: function(path, callback, options) {
49950           options = assignIn({ skipSeen: true }, options);
49951           var that = this;
49952           var cid = _connectionID;
49953
49954           function done(err, xml) {
49955               if (that.getConnectionId() !== cid) {
49956                   if (callback) callback({ message: 'Connection Switched', status: -1 });
49957                   return;
49958               }
49959
49960               var isAuthenticated = that.authenticated();
49961
49962               // 400 Bad Request, 401 Unauthorized, 403 Forbidden
49963               // Logout and retry the request..
49964               if (isAuthenticated && err && (err.status === 400 || err.status === 401 || err.status === 403)) {
49965                   that.logout();
49966                   that.loadFromAPI(path, callback, options);
49967
49968               // else, no retry..
49969               } else {
49970                   // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
49971                   // Set the rateLimitError flag and trigger a warning..
49972                   if (!isAuthenticated && !_rateLimitError && err &&
49973                           (err.status === 509 || err.status === 429)) {
49974                       _rateLimitError = err;
49975                       dispatch$5.call('change');
49976                   }
49977
49978                   if (callback) {
49979                       if (err) {
49980                           return callback(err);
49981                       } else {
49982                           return parseXML(xml, callback, options);
49983                       }
49984                   }
49985               }
49986           }
49987
49988           if (this.authenticated()) {
49989               return oauth.xhr({ method: 'GET', path: path }, done);
49990           } else {
49991               var url = urlroot + path;
49992               return d3_xml(url).get(done);
49993           }
49994       },
49995
49996
49997       // Load a single entity by id (ways and relations use the `/full` call)
49998       // GET /api/0.6/node/#id
49999       // GET /api/0.6/[way|relation]/#id/full
50000       loadEntity: function(id, callback) {
50001           var type = osmEntity.id.type(id);
50002           var osmID = osmEntity.id.toOSM(id);
50003           var options = { skipSeen: false };
50004
50005           this.loadFromAPI(
50006               '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
50007               function(err, entities) {
50008                   if (callback) callback(err, { data: entities });
50009               },
50010               options
50011           );
50012       },
50013
50014
50015       // Load a single entity with a specific version
50016       // GET /api/0.6/[node|way|relation]/#id/#version
50017       loadEntityVersion: function(id, version, callback) {
50018           var type = osmEntity.id.type(id);
50019           var osmID = osmEntity.id.toOSM(id);
50020           var options = { skipSeen: false };
50021
50022           this.loadFromAPI(
50023               '/api/0.6/' + type + '/' + osmID + '/' + version,
50024               function(err, entities) {
50025                   if (callback) callback(err, { data: entities });
50026               },
50027               options
50028           );
50029       },
50030
50031
50032       // Load multiple entities in chunks
50033       // (note: callback may be called multiple times)
50034       // GET /api/0.6/[nodes|ways|relations]?#parameters
50035       loadMultiple: function(ids, callback) {
50036           var that = this;
50037
50038           forEach(groupBy(uniq(ids), osmEntity.id.type), function(v, k) {
50039               var type = k + 's';
50040               var osmIDs = map$3(v, osmEntity.id.toOSM);
50041               var options = { skipSeen: false };
50042
50043               forEach(chunk(osmIDs, 150), function(arr) {
50044                   that.loadFromAPI(
50045                       '/api/0.6/' + type + '?' + type + '=' + arr.join(),
50046                       function(err, entities) {
50047                           if (callback) callback(err, { data: entities });
50048                       },
50049                       options
50050                   );
50051               });
50052           });
50053       },
50054
50055
50056       // Create, upload, and close a changeset
50057       // PUT /api/0.6/changeset/create
50058       // POST /api/0.6/changeset/#id/upload
50059       // PUT /api/0.6/changeset/#id/close
50060       putChangeset: function(changeset, changes, callback) {
50061           var cid = _connectionID;
50062
50063           if (_changeset.inflight) {
50064               return callback({ message: 'Changeset already inflight', status: -2 }, changeset);
50065
50066           } else if (_changeset.open) {   // reuse existing open changeset..
50067               return createdChangeset.call(this, null, _changeset.open);
50068
50069           } else {   // Open a new changeset..
50070               var options = {
50071                   method: 'PUT',
50072                   path: '/api/0.6/changeset/create',
50073                   options: { header: { 'Content-Type': 'text/xml' } },
50074                   content: JXON.stringify(changeset.asJXON())
50075               };
50076               _changeset.inflight = oauth.xhr(
50077                   options,
50078                   wrapcb(this, createdChangeset, cid)
50079               );
50080           }
50081
50082
50083           function createdChangeset(err, changesetID) {
50084               _changeset.inflight = null;
50085               if (err) { return callback(err, changeset); }
50086
50087               _changeset.open = changesetID;
50088               changeset = changeset.update({ id: changesetID });
50089
50090               // Upload the changeset..
50091               var options = {
50092                   method: 'POST',
50093                   path: '/api/0.6/changeset/' + changesetID + '/upload',
50094                   options: { header: { 'Content-Type': 'text/xml' } },
50095                   content: JXON.stringify(changeset.osmChangeJXON(changes))
50096               };
50097               _changeset.inflight = oauth.xhr(
50098                   options,
50099                   wrapcb(this, uploadedChangeset, cid)
50100               );
50101           }
50102
50103
50104           function uploadedChangeset(err) {
50105               _changeset.inflight = null;
50106               if (err) return callback(err, changeset);
50107
50108               // Upload was successful, safe to call the callback.
50109               // Add delay to allow for postgres replication #1646 #2678
50110               window.setTimeout(function() { callback(null, changeset); }, 2500);
50111               _changeset.open = null;
50112
50113               // At this point, we don't really care if the connection was switched..
50114               // Only try to close the changeset if we're still talking to the same server.
50115               if (this.getConnectionId() === cid) {
50116                   // Still attempt to close changeset, but ignore response because #2667
50117                   oauth.xhr({
50118                       method: 'PUT',
50119                       path: '/api/0.6/changeset/' + changeset.id + '/close',
50120                       options: { header: { 'Content-Type': 'text/xml' } }
50121                   }, function() { return true; });
50122               }
50123           }
50124       },
50125
50126
50127       // Load multiple users in chunks
50128       // (note: callback may be called multiple times)
50129       // GET /api/0.6/users?users=#id1,#id2,...,#idn
50130       loadUsers: function(uids, callback) {
50131           var toLoad = [];
50132           var cached = [];
50133
50134           uniq(uids).forEach(function(uid) {
50135               if (_userCache.user[uid]) {
50136                   delete _userCache.toLoad[uid];
50137                   cached.push(_userCache.user[uid]);
50138               } else {
50139                   toLoad.push(uid);
50140               }
50141           });
50142
50143           if (cached.length || !this.authenticated()) {
50144               callback(undefined, cached);
50145               if (!this.authenticated()) return;  // require auth
50146           }
50147
50148           chunk(toLoad, 150).forEach(function(arr) {
50149               oauth.xhr(
50150                   { method: 'GET', path: '/api/0.6/users?users=' + arr.join() },
50151                   wrapcb(this, done, _connectionID)
50152               );
50153           }.bind(this));
50154
50155           function done(err, xml) {
50156               if (err) { return callback(err); }
50157
50158               var options = { skipSeen: true };
50159               return parseXML(xml, function(err, results) {
50160                   if (err) {
50161                       return callback(err);
50162                   } else {
50163                       return callback(undefined, results);
50164                   }
50165               }, options);
50166           }
50167       },
50168
50169
50170       // Load a given user by id
50171       // GET /api/0.6/user/#id
50172       loadUser: function(uid, callback) {
50173           if (_userCache.user[uid] || !this.authenticated()) {   // require auth
50174               delete _userCache.toLoad[uid];
50175               return callback(undefined, _userCache.user[uid]);
50176           }
50177
50178           oauth.xhr(
50179               { method: 'GET', path: '/api/0.6/user/' + uid },
50180               wrapcb(this, done, _connectionID)
50181           );
50182
50183           function done(err, xml) {
50184               if (err) { return callback(err); }
50185
50186               var options = { skipSeen: true };
50187               return parseXML(xml, function(err, results) {
50188                   if (err) {
50189                       return callback(err);
50190                   } else {
50191                       return callback(undefined, results[0]);
50192                   }
50193               }, options);
50194           }
50195       },
50196
50197
50198       // Load the details of the logged-in user
50199       // GET /api/0.6/user/details
50200       userDetails: function(callback) {
50201           if (_userDetails) {    // retrieve cached
50202               return callback(undefined, _userDetails);
50203           }
50204
50205           oauth.xhr(
50206               { method: 'GET', path: '/api/0.6/user/details' },
50207               wrapcb(this, done, _connectionID)
50208           );
50209
50210           function done(err, xml) {
50211               if (err) { return callback(err); }
50212
50213               var options = { skipSeen: false };
50214               return parseXML(xml, function(err, results) {
50215                   if (err) {
50216                       return callback(err);
50217                   } else {
50218                       _userDetails = results[0];
50219                       return callback(undefined, _userDetails);
50220                   }
50221               }, options);
50222           }
50223       },
50224
50225
50226       // Load previous changesets for the logged in user
50227       // GET /api/0.6/changesets?user=#id
50228       userChangesets: function(callback) {
50229           if (_userChangesets) {    // retrieve cached
50230               return callback(undefined, _userChangesets);
50231           }
50232
50233           this.userDetails(
50234               wrapcb(this, gotDetails, _connectionID)
50235           );
50236
50237
50238           function gotDetails(err, user) {
50239               if (err) { return callback(err); }
50240
50241               oauth.xhr(
50242                   { method: 'GET', path: '/api/0.6/changesets?user=' + user.id },
50243                   wrapcb(this, done, _connectionID)
50244               );
50245           }
50246
50247           function done(err, xml) {
50248               if (err) { return callback(err); }
50249
50250               _userChangesets = Array.prototype.map.call(
50251                   xml.getElementsByTagName('changeset'),
50252                   function (changeset) { return { tags: getTags(changeset) }; }
50253               ).filter(function (changeset) {
50254                   var comment = changeset.tags.comment;
50255                   return comment && comment !== '';
50256               });
50257
50258               return callback(undefined, _userChangesets);
50259           }
50260       },
50261
50262
50263       // Fetch the status of the OSM API
50264       // GET /api/capabilities
50265       status: function(callback) {
50266           d3_xml(urlroot + '/api/capabilities').get(
50267               wrapcb(this, done, _connectionID)
50268           );
50269
50270           function done(err, xml) {
50271               if (err) { return callback(err); }
50272
50273               // update blacklists
50274               var elements = xml.getElementsByTagName('blacklist');
50275               var regexes = [];
50276               for (var i = 0; i < elements.length; i++) {
50277                   var regex = elements[i].getAttribute('regex');  // needs unencode?
50278                   if (regex) {
50279                       regexes.push(regex);
50280                   }
50281               }
50282               if (regexes.length) {
50283                   _blacklists = regexes;
50284               }
50285
50286               if (_rateLimitError) {
50287                   return callback(_rateLimitError, 'rateLimited');
50288               } else {
50289                   var apiStatus = xml.getElementsByTagName('status');
50290                   var val = apiStatus[0].getAttribute('api');
50291                   return callback(undefined, val);
50292               }
50293           }
50294       },
50295
50296
50297       // Load data (entities) from the API in tiles
50298       // GET /api/0.6/map?bbox=
50299       loadTiles: function(projection, callback) {
50300           if (_off) return;
50301
50302           var that = this;
50303           var path = '/api/0.6/map?bbox=';
50304
50305           // determine the needed tiles to cover the view
50306           var tiles = tiler$4.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection);
50307
50308           // abort inflight requests that are no longer needed
50309           var hadRequests = !isEmpty(_tileCache.inflight);
50310           abortUnwantedRequests$2(_tileCache, tiles);
50311           if (hadRequests && isEmpty(_tileCache.inflight)) {
50312               dispatch$5.call('loaded');    // stop the spinner
50313           }
50314
50315           // issue new requests..
50316           tiles.forEach(function(tile) {
50317               if (_tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) return;
50318               if (isEmpty(_tileCache.inflight)) {
50319                   dispatch$5.call('loading');   // start the spinner
50320               }
50321
50322               var options = { skipSeen: true };
50323               _tileCache.inflight[tile.id] = that.loadFromAPI(
50324                   path + tile.extent.toParam(),
50325                   function(err, parsed) {
50326                       delete _tileCache.inflight[tile.id];
50327                       if (!err) {
50328                           _tileCache.loaded[tile.id] = true;
50329                       }
50330                       if (callback) {
50331                           callback(err, assignIn({ data: parsed }, tile));
50332                       }
50333                       if (isEmpty(_tileCache.inflight)) {
50334                           dispatch$5.call('loaded');     // stop the spinner
50335                       }
50336                   },
50337                   options
50338               );
50339           });
50340       },
50341
50342
50343       // Load notes from the API in tiles
50344       // GET /api/0.6/notes?bbox=
50345       loadNotes: function(projection, noteOptions) {
50346           noteOptions = assignIn({ limit: 10000, closed: 7 }, noteOptions);
50347           if (_off) return;
50348
50349           var that = this;
50350           var path = '/api/0.6/notes?limit=' + noteOptions.limit + '&closed=' + noteOptions.closed + '&bbox=';
50351           var throttleLoadUsers = throttle(function() {
50352               var uids = Object.keys(_userCache.toLoad);
50353               if (!uids.length) return;
50354               that.loadUsers(uids, function() {});  // eagerly load user details
50355           }, 750);
50356
50357           // determine the needed tiles to cover the view
50358           var tiles = tiler$4.zoomExtent([_noteZoom, _noteZoom]).getTiles(projection);
50359
50360           // abort inflight requests that are no longer needed
50361           abortUnwantedRequests$2(_noteCache, tiles);
50362
50363           // issue new requests..
50364           tiles.forEach(function(tile) {
50365               if (_noteCache.loaded[tile.id] || _noteCache.inflight[tile.id]) return;
50366
50367               var options = { skipSeen: false };
50368               _noteCache.inflight[tile.id] = that.loadFromAPI(
50369                   path + tile.extent.toParam(),
50370                   function(err) {
50371                       delete _noteCache.inflight[tile.id];
50372                       if (!err) {
50373                           _noteCache.loaded[tile.id] = true;
50374                       }
50375                       throttleLoadUsers();
50376                       dispatch$5.call('loadedNotes');
50377                   },
50378                   options
50379               );
50380           });
50381       },
50382
50383
50384       // Create a note
50385       // POST /api/0.6/notes?params
50386       postNoteCreate: function(note, callback) {
50387           if (!this.authenticated()) {
50388               return callback({ message: 'Not Authenticated', status: -3 }, note);
50389           }
50390           if (_noteCache.inflightPost[note.id]) {
50391               return callback({ message: 'Note update already inflight', status: -2 }, note);
50392           }
50393
50394           if (!note.loc[0] || !note.loc[1] || !note.newComment) return; // location & description required
50395
50396           var comment = note.newComment;
50397           if (note.newCategory && note.newCategory !== 'None') { comment += ' #' + note.newCategory; }
50398
50399           var path = '/api/0.6/notes?' + utilQsString({ lon: note.loc[0], lat: note.loc[1], text: comment });
50400
50401           _noteCache.inflightPost[note.id] = oauth.xhr(
50402               { method: 'POST', path: path },
50403               wrapcb(this, done, _connectionID)
50404           );
50405
50406
50407           function done(err, xml) {
50408               delete _noteCache.inflightPost[note.id];
50409               if (err) { return callback(err); }
50410
50411               // we get the updated note back, remove from caches and reparse..
50412               this.removeNote(note);
50413
50414               var options = { skipSeen: false };
50415               return parseXML(xml, function(err, results) {
50416                   if (err) {
50417                       return callback(err);
50418                   } else {
50419                       return callback(undefined, results[0]);
50420                   }
50421               }, options);
50422           }
50423       },
50424
50425
50426       // Update a note
50427       // POST /api/0.6/notes/#id/comment?text=comment
50428       // POST /api/0.6/notes/#id/close?text=comment
50429       // POST /api/0.6/notes/#id/reopen?text=comment
50430       postNoteUpdate: function(note, newStatus, callback) {
50431           if (!this.authenticated()) {
50432               return callback({ message: 'Not Authenticated', status: -3 }, note);
50433           }
50434           if (_noteCache.inflightPost[note.id]) {
50435               return callback({ message: 'Note update already inflight', status: -2 }, note);
50436           }
50437
50438           var action;
50439           if (note.status !== 'closed' && newStatus === 'closed') {
50440               action = 'close';
50441           } else if (note.status !== 'open' && newStatus === 'open') {
50442               action = 'reopen';
50443           } else {
50444               action = 'comment';
50445               if (!note.newComment) return; // when commenting, comment required
50446           }
50447
50448           var path = '/api/0.6/notes/' + note.id + '/' + action;
50449           if (note.newComment) {
50450               path += '?' + utilQsString({ text: note.newComment });
50451           }
50452
50453           _noteCache.inflightPost[note.id] = oauth.xhr(
50454               { method: 'POST', path: path },
50455               wrapcb(this, done, _connectionID)
50456           );
50457
50458
50459           function done(err, xml) {
50460               delete _noteCache.inflightPost[note.id];
50461               if (err) { return callback(err); }
50462
50463               // we get the updated note back, remove from caches and reparse..
50464               this.removeNote(note);
50465
50466               // update closed note cache - used to populate `closed:note` changeset tag
50467               if (action === 'close') {
50468                   _noteCache.closed[note.id] = true;
50469               } else if (action === 'reopen') {
50470                   delete _noteCache.closed[note.id];
50471               }
50472
50473               var options = { skipSeen: false };
50474               return parseXML(xml, function(err, results) {
50475                   if (err) {
50476                       return callback(err);
50477                   } else {
50478                       return callback(undefined, results[0]);
50479                   }
50480               }, options);
50481           }
50482       },
50483
50484
50485       switch: function(options) {
50486           urlroot = options.urlroot;
50487
50488           oauth.options(assignIn({
50489               url: urlroot,
50490               loading: authLoading,
50491               done: authDone
50492           }, options));
50493
50494           this.reset();
50495           this.userChangesets(function() {});  // eagerly load user details/changesets
50496           dispatch$5.call('change');
50497           return this;
50498       },
50499
50500
50501       toggle: function(_) {
50502           _off = !_;
50503           return this;
50504       },
50505
50506
50507       isChangesetInflight: function() {
50508           return !!_changeset.inflight;
50509       },
50510
50511
50512       // get/set cached data
50513       // This is used to save/restore the state when entering/exiting the walkthrough
50514       // Also used for testing purposes.
50515       caches: function(obj) {
50516           if (!arguments.length) {
50517               return {
50518                   tile: cloneDeep(_tileCache),
50519                   note: cloneDeep(_noteCache),
50520                   user: cloneDeep(_userCache)
50521               };
50522           }
50523
50524           // access caches directly for testing (e.g., loading notes rtree)
50525           if (obj === 'get') {
50526               return {
50527                   tile: _tileCache,
50528                   note: _noteCache,
50529                   user: _userCache
50530               };
50531           }
50532
50533           if (obj.tile) {
50534               _tileCache = obj.tile;
50535               _tileCache.inflight = {};
50536           }
50537           if (obj.note) {
50538               _noteCache = obj.note;
50539               _noteCache.inflight = {};
50540               _noteCache.inflightPost = {};
50541           }
50542           if (obj.user) {
50543               _userCache = obj.user;
50544           }
50545
50546           return this;
50547       },
50548
50549
50550       logout: function() {
50551           _userChangesets = undefined;
50552           _userDetails = undefined;
50553           oauth.logout();
50554           dispatch$5.call('change');
50555           return this;
50556       },
50557
50558
50559       authenticated: function() {
50560           return oauth.authenticated();
50561       },
50562
50563
50564       authenticate: function(callback) {
50565           var that = this;
50566           var cid = _connectionID;
50567           _userChangesets = undefined;
50568           _userDetails = undefined;
50569
50570           function done(err, res) {
50571               if (err) {
50572                   if (callback) callback(err);
50573                   return;
50574               }
50575               if (that.getConnectionId() !== cid) {
50576                   if (callback) callback({ message: 'Connection Switched', status: -1 });
50577                   return;
50578               }
50579               _rateLimitError = undefined;
50580               dispatch$5.call('change');
50581               if (callback) callback(err, res);
50582               that.userChangesets(function() {});  // eagerly load user details/changesets
50583           }
50584
50585           return oauth.authenticate(done);
50586       },
50587
50588
50589       imageryBlacklists: function() {
50590           return _blacklists;
50591       },
50592
50593
50594       tileZoom: function(_) {
50595           if (!arguments.length) return _tileZoom;
50596           _tileZoom = _;
50597           return this;
50598       },
50599
50600
50601       // get all cached notes covering the viewport
50602       notes: function(projection) {
50603           var viewport = projection.clipExtent();
50604           var min = [viewport[0][0], viewport[1][1]];
50605           var max = [viewport[1][0], viewport[0][1]];
50606           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
50607
50608           return _noteCache.rtree.search(bbox)
50609               .map(function(d) { return d.data; });
50610       },
50611
50612
50613       // get a single note from the cache
50614       getNote: function(id) {
50615           return _noteCache.note[id];
50616       },
50617
50618
50619       // remove a single note from the cache
50620       removeNote: function(note) {
50621           if (!(note instanceof osmNote) || !note.id) return;
50622
50623           delete _noteCache.note[note.id];
50624           updateRtree$2(encodeNoteRtree(note), false);  // false = remove
50625       },
50626
50627
50628       // replace a single note in the cache
50629       replaceNote: function(note) {
50630           if (!(note instanceof osmNote) || !note.id) return;
50631
50632           _noteCache.note[note.id] = note;
50633           updateRtree$2(encodeNoteRtree(note), true);  // true = replace
50634           return note;
50635       },
50636
50637
50638       // Get an array of note IDs closed during this session.
50639       // Used to populate `closed:note` changeset tag
50640       getClosedIDs: function() {
50641           return Object.keys(_noteCache.closed).sort();
50642       }
50643
50644   };
50645
50646   var apibase$3 = 'https://wiki.openstreetmap.org/w/api.php';
50647   var _inflight = {};
50648   var _wikibaseCache = {};
50649   var _localeIDs = { en: false };
50650
50651
50652   var debouncedRequest = debounce(request$1, 500, { leading: false });
50653
50654   function request$1(url, callback) {
50655       if (_inflight[url]) return;
50656
50657       _inflight[url] = d3_json(url, function (err, data) {
50658           delete _inflight[url];
50659           callback(err, data);
50660       });
50661   }
50662
50663
50664   /**
50665    * Get the best string value from the descriptions/labels result
50666    * Note that if mediawiki doesn't recognize language code, it will return all values.
50667    * In that case, fallback to use English.
50668    * @param values object - either descriptions or labels
50669    * @param langCode String
50670    * @returns localized string
50671    */
50672   function localizedToString(values, langCode) {
50673       if (values) {
50674           values = values[langCode] || values.en;
50675       }
50676       return values ? values.value : '';
50677   }
50678
50679
50680   var serviceOsmWikibase = {
50681
50682       init: function() {
50683           _inflight = {};
50684           _wikibaseCache = {};
50685           _localeIDs = {};
50686       },
50687
50688
50689       reset: function() {
50690           forEach(_inflight, function(req) { req.abort(); });
50691           _inflight = {};
50692       },
50693
50694
50695       /**
50696        * Get the best value for the property, or undefined if not found
50697        * @param entity object from wikibase
50698        * @param property string e.g. 'P4' for image
50699        * @param langCode string e.g. 'fr' for French
50700        */
50701       claimToValue: function(entity, property, langCode) {
50702           if (!entity.claims[property]) return undefined;
50703           var locale = _localeIDs[langCode];
50704           var preferredPick, localePick;
50705
50706           forEach(entity.claims[property], function(stmt) {
50707               // If exists, use value limited to the needed language (has a qualifier P26 = locale)
50708               // Or if not found, use the first value with the "preferred" rank
50709               if (!preferredPick && stmt.rank === 'preferred') {
50710                   preferredPick = stmt;
50711               }
50712               if (locale && stmt.qualifiers && stmt.qualifiers.P26 &&
50713                   stmt.qualifiers.P26[0].datavalue.value.id === locale
50714               ) {
50715                   localePick = stmt;
50716               }
50717           });
50718
50719           var result = localePick || preferredPick;
50720           if (result) {
50721               var datavalue = result.mainsnak.datavalue;
50722               return datavalue.type === 'wikibase-entityid' ? datavalue.value.id : datavalue.value;
50723           } else {
50724               return undefined;
50725           }
50726       },
50727
50728
50729       /**
50730        * Convert monolingual property into a key-value object (language -> value)
50731        * @param entity object from wikibase
50732        * @param property string e.g. 'P31' for monolingual wiki page title
50733        */
50734       monolingualClaimToValueObj: function(entity, property) {
50735           if (!entity || !entity.claims[property]) return undefined;
50736
50737           return entity.claims[property].reduce(function(acc, obj) {
50738               var value = obj.mainsnak.datavalue.value;
50739               acc[value.language] = value.text;
50740               return acc;
50741           }, {});
50742       },
50743
50744
50745       toSitelink: function(key, value) {
50746           var result = value ? ('Tag:' + key + '=' + value) : 'Key:' + key;
50747           return result.replace(/_/g, ' ').trim();
50748       },
50749
50750
50751       //
50752       // Pass params object of the form:
50753       // {
50754       //   key: 'string',
50755       //   value: 'string',
50756       //   rtype: 'string',
50757       //   langCode: 'string'
50758       // }
50759       //
50760       getEntity: function(params, callback) {
50761           var doRequest = params.debounce ? debouncedRequest : request$1;
50762           var that = this;
50763           var titles = [];
50764           var result = {};
50765           var rtypeSitelink = params.rtype ? ('Relation:' + params.rtype).replace(/_/g, ' ').trim() : false;
50766           var keySitelink = params.key ? this.toSitelink(params.key) : false;
50767           var tagSitelink = (params.key && params.value) ? this.toSitelink(params.key, params.value) : false;
50768           var localeSitelink;
50769
50770           if (params.langCode && _localeIDs[params.langCode] === undefined) {
50771               // If this is the first time we are asking about this locale,
50772               // fetch corresponding entity (if it exists), and cache it.
50773               // If there is no such entry, cache `false` value to avoid re-requesting it.
50774               localeSitelink = ('Locale:' + params.langCode).replace(/_/g, ' ').trim();
50775               titles.push(localeSitelink);
50776           }
50777
50778           if (rtypeSitelink) {
50779               if (_wikibaseCache[rtypeSitelink]) {
50780                   result.rtype = _wikibaseCache[rtypeSitelink];
50781               } else {
50782                   titles.push(rtypeSitelink);
50783               }
50784           }
50785
50786           if (keySitelink) {
50787               if (_wikibaseCache[keySitelink]) {
50788                   result.key = _wikibaseCache[keySitelink];
50789               } else {
50790                   titles.push(keySitelink);
50791               }
50792           }
50793
50794           if (tagSitelink) {
50795               if (_wikibaseCache[tagSitelink]) {
50796                   result.tag = _wikibaseCache[tagSitelink];
50797               } else {
50798                   titles.push(tagSitelink);
50799               }
50800           }
50801
50802           if (!titles.length) {
50803               // Nothing to do, we already had everything in the cache
50804               return callback(null, result);
50805           }
50806
50807           // Requesting just the user language code
50808           // If backend recognizes the code, it will perform proper fallbacks,
50809           // and the result will contain the requested code. If not, all values are returned:
50810           // {"zh-tw":{"value":"...","language":"zh-tw","source-language":"zh-hant"}
50811           // {"pt-br":{"value":"...","language":"pt","for-language":"pt-br"}}
50812           var obj = {
50813               action: 'wbgetentities',
50814               sites: 'wiki',
50815               titles: titles.join('|'),
50816               languages: params.langCode,
50817               languagefallback: 1,
50818               origin: '*',
50819               format: 'json',
50820               // There is an MW Wikibase API bug https://phabricator.wikimedia.org/T212069
50821               // We shouldn't use v1 until it gets fixed, but should switch to it afterwards
50822               // formatversion: 2,
50823           };
50824
50825           var url = apibase$3 + '?' + utilQsString(obj);
50826           doRequest(url, function(err, d) {
50827               if (err) {
50828                   callback(err);
50829               } else if (!d.success || d.error) {
50830                   callback(d.error.messages.map(function(v) { return v.html['*']; }).join('<br>'));
50831               } else {
50832                   var localeID = false;
50833                   forEach(d.entities, function(res) {
50834                       if (res.missing !== '') {
50835                           // Simplify access to the localized values
50836                           res.description = localizedToString(res.descriptions, params.langCode);
50837                           res.label = localizedToString(res.labels, params.langCode);
50838
50839                           var title = res.sitelinks.wiki.title;
50840                           if (title === rtypeSitelink) {
50841                               _wikibaseCache[rtypeSitelink] = res;
50842                               result.rtype = res;
50843                           } else if (title === keySitelink) {
50844                               _wikibaseCache[keySitelink] = res;
50845                               result.key = res;
50846                           } else if (title === tagSitelink) {
50847                               _wikibaseCache[tagSitelink] = res;
50848                               result.tag = res;
50849                           } else if (title === localeSitelink) {
50850                               localeID = res.id;
50851                           } else {
50852                               console.log('Unexpected title ' + title);  // eslint-disable-line no-console
50853                           }
50854                       }
50855                   });
50856
50857                   if (localeSitelink) {
50858                       // If locale ID is not found, store false to prevent repeated queries
50859                       that.addLocale(params.langCode, localeID);
50860                   }
50861
50862                   callback(null, result);
50863               }
50864           });
50865       },
50866
50867
50868       //
50869       // Pass params object of the form:
50870       // {
50871       //   key: 'string',     // required
50872       //   value: 'string'    // optional
50873       // }
50874       //   -or-
50875       // {
50876       //   rtype: 'rtype'     // relation type  (e.g. 'multipolygon')
50877       // }
50878       //
50879       // Get an result object used to display tag documentation
50880       // {
50881       //   title:        'string',
50882       //   description:  'string',
50883       //   editURL:      'string',
50884       //   imageURL:     'string',
50885       //   wiki:         { title: 'string', text: 'string', url: 'string' }
50886       // }
50887       //
50888       getDocs: function(params, callback) {
50889           var that = this;
50890           var langCode = utilDetect().locale.toLowerCase();
50891           params.langCode = langCode;
50892
50893           this.getEntity(params, function(err, data) {
50894               if (err) {
50895                   callback(err);
50896                   return;
50897               }
50898
50899               var entity = data.rtype || data.tag || data.key;
50900               if (!entity) {
50901                   callback('No entity');
50902                   return;
50903               }
50904
50905               // prepare result
50906               var result = {
50907                   title: entity.title,
50908                   description: entity.description,
50909                   editURL: 'https://wiki.openstreetmap.org/wiki/' + entity.title
50910               };
50911
50912               // add image
50913               if (entity.claims) {
50914                   var imageroot;
50915                   var image = that.claimToValue(entity, 'P4', langCode);
50916                   if (image) {
50917                       imageroot = 'https://commons.wikimedia.org/w/index.php';
50918                   } else {
50919                       image = that.claimToValue(entity, 'P28', langCode);
50920                       if (image) {
50921                           imageroot = 'https://wiki.openstreetmap.org/w/index.php';
50922                       }
50923                   }
50924                   if (imageroot && image) {
50925                       result.imageURL = imageroot + '?' + utilQsString({
50926                           title: 'Special:Redirect/file/' + image,
50927                           width: 400
50928                       });
50929                   }
50930               }
50931
50932               // Try to get a wiki page from tag data item first, followed by the corresponding key data item.
50933               // If neither tag nor key data item contain a wiki page in the needed language nor English,
50934               // get the first found wiki page from either the tag or the key item.
50935               var rtypeWiki = that.monolingualClaimToValueObj(data.rtype, 'P31');
50936               var tagWiki = that.monolingualClaimToValueObj(data.tag, 'P31');
50937               var keyWiki = that.monolingualClaimToValueObj(data.key, 'P31');
50938
50939               // If exact language code does not exist, try to find the first part before the '-'
50940               // BUG: in some cases, a more elaborate fallback logic might be needed
50941               var langPrefix = langCode.split('-', 2)[0];
50942
50943               // use the first acceptable wiki page
50944               result.wiki =
50945                   getWikiInfo(rtypeWiki, langCode, 'inspector.wiki_reference') ||
50946                   getWikiInfo(rtypeWiki, langPrefix, 'inspector.wiki_reference') ||
50947                   getWikiInfo(rtypeWiki, 'en', 'inspector.wiki_en_reference') ||
50948                   getWikiInfo(tagWiki, langCode, 'inspector.wiki_reference') ||
50949                   getWikiInfo(tagWiki, langPrefix, 'inspector.wiki_reference') ||
50950                   getWikiInfo(tagWiki, 'en', 'inspector.wiki_en_reference') ||
50951                   getWikiInfo(keyWiki, langCode, 'inspector.wiki_reference') ||
50952                   getWikiInfo(keyWiki, langPrefix, 'inspector.wiki_reference') ||
50953                   getWikiInfo(keyWiki, 'en', 'inspector.wiki_en_reference');
50954
50955               callback(null, result);
50956
50957
50958               // Helper method to get wiki info if a given language exists
50959               function getWikiInfo(wiki, langCode, tKey) {
50960                   if (wiki && wiki[langCode]) {
50961                       return {
50962                           title: wiki[langCode],
50963                           text: tKey,
50964                           url: 'https://wiki.openstreetmap.org/wiki/' + wiki[langCode]
50965                       };
50966                   }
50967               }
50968           });
50969       },
50970
50971
50972       addLocale: function(langCode, qid) {
50973           // Makes it easier to unit test
50974           _localeIDs[langCode] = qid;
50975       },
50976
50977
50978       apibase: function(val) {
50979           if (!arguments.length) return apibase$3;
50980           apibase$3 = val;
50981           return this;
50982       }
50983
50984   };
50985
50986   var jsonpCache = {};
50987   window.jsonpCache = jsonpCache;
50988
50989   function jsonpRequest(url, callback) {
50990       var request = {
50991           abort: function() {}
50992       };
50993
50994       if (window.JSONP_FIX) {
50995           if (window.JSONP_DELAY === 0) {
50996               callback(window.JSONP_FIX);
50997           } else {
50998               var t = window.setTimeout(function() {
50999                   callback(window.JSONP_FIX);
51000               }, window.JSONP_DELAY || 0);
51001
51002               request.abort = function() { window.clearTimeout(t); };
51003           }
51004
51005           return request;
51006       }
51007
51008       function rand() {
51009           var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
51010           var c = '';
51011           var i = -1;
51012           while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
51013           return c;
51014       }
51015
51016       function create(url) {
51017           var e = url.match(/callback=(\w+)/);
51018           var c = e ? e[1] : rand();
51019
51020           jsonpCache[c] = function(data) {
51021               if (jsonpCache[c]) {
51022                   callback(data);
51023               }
51024               finalize();
51025           };
51026
51027           function finalize() {
51028               delete jsonpCache[c];
51029               script.remove();
51030           }
51031
51032           request.abort = finalize;
51033           return 'jsonpCache.' + c;
51034       }
51035
51036       var cb = create(url);
51037
51038       var script = select('head')
51039           .append('script')
51040           .attr('type', 'text/javascript')
51041           .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
51042
51043       return request;
51044   }
51045
51046   var q = createCommonjsModule(function (module, exports) {
51047   // vim:ts=4:sts=4:sw=4:
51048   /*!
51049    *
51050    * Copyright 2009-2017 Kris Kowal under the terms of the MIT
51051    * license found at https://github.com/kriskowal/q/blob/v1/LICENSE
51052    *
51053    * With parts by Tyler Close
51054    * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
51055    * at http://www.opensource.org/licenses/mit-license.html
51056    * Forked at ref_send.js version: 2009-05-11
51057    *
51058    * With parts by Mark Miller
51059    * Copyright (C) 2011 Google Inc.
51060    *
51061    * Licensed under the Apache License, Version 2.0 (the "License");
51062    * you may not use this file except in compliance with the License.
51063    * You may obtain a copy of the License at
51064    *
51065    * http://www.apache.org/licenses/LICENSE-2.0
51066    *
51067    * Unless required by applicable law or agreed to in writing, software
51068    * distributed under the License is distributed on an "AS IS" BASIS,
51069    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
51070    * See the License for the specific language governing permissions and
51071    * limitations under the License.
51072    *
51073    */
51074
51075   (function (definition) {
51076
51077       // This file will function properly as a <script> tag, or a module
51078       // using CommonJS and NodeJS or RequireJS module formats.  In
51079       // Common/Node/RequireJS, the module exports the Q API and when
51080       // executed as a simple <script>, it creates a Q global instead.
51081
51082       // Montage Require
51083       if (typeof bootstrap === "function") {
51084           bootstrap("promise", definition);
51085
51086       // CommonJS
51087       } else {
51088           module.exports = definition();
51089
51090       // RequireJS
51091       }
51092
51093   })(function () {
51094
51095   var hasStacks = false;
51096   try {
51097       throw new Error();
51098   } catch (e) {
51099       hasStacks = !!e.stack;
51100   }
51101
51102   // All code after this point will be filtered from stack traces reported
51103   // by Q.
51104   var qStartingLine = captureLine();
51105   var qFileName;
51106
51107   // shims
51108
51109   // used for fallback in "allResolved"
51110   var noop = function () {};
51111
51112   // Use the fastest possible means to execute a task in a future turn
51113   // of the event loop.
51114   var nextTick =(function () {
51115       // linked list of tasks (single, with head node)
51116       var head = {task: void 0, next: null};
51117       var tail = head;
51118       var flushing = false;
51119       var requestTick = void 0;
51120       var isNodeJS = false;
51121       // queue for late tasks, used by unhandled rejection tracking
51122       var laterQueue = [];
51123
51124       function flush() {
51125           /* jshint loopfunc: true */
51126           var task, domain;
51127
51128           while (head.next) {
51129               head = head.next;
51130               task = head.task;
51131               head.task = void 0;
51132               domain = head.domain;
51133
51134               if (domain) {
51135                   head.domain = void 0;
51136                   domain.enter();
51137               }
51138               runSingle(task, domain);
51139
51140           }
51141           while (laterQueue.length) {
51142               task = laterQueue.pop();
51143               runSingle(task);
51144           }
51145           flushing = false;
51146       }
51147       // runs a single function in the async queue
51148       function runSingle(task, domain) {
51149           try {
51150               task();
51151
51152           } catch (e) {
51153               if (isNodeJS) {
51154                   // In node, uncaught exceptions are considered fatal errors.
51155                   // Re-throw them synchronously to interrupt flushing!
51156
51157                   // Ensure continuation if the uncaught exception is suppressed
51158                   // listening "uncaughtException" events (as domains does).
51159                   // Continue in next event to avoid tick recursion.
51160                   if (domain) {
51161                       domain.exit();
51162                   }
51163                   setTimeout(flush, 0);
51164                   if (domain) {
51165                       domain.enter();
51166                   }
51167
51168                   throw e;
51169
51170               } else {
51171                   // In browsers, uncaught exceptions are not fatal.
51172                   // Re-throw them asynchronously to avoid slow-downs.
51173                   setTimeout(function () {
51174                       throw e;
51175                   }, 0);
51176               }
51177           }
51178
51179           if (domain) {
51180               domain.exit();
51181           }
51182       }
51183
51184       nextTick = function (task) {
51185           tail = tail.next = {
51186               task: task,
51187               domain: isNodeJS && process.domain,
51188               next: null
51189           };
51190
51191           if (!flushing) {
51192               flushing = true;
51193               requestTick();
51194           }
51195       };
51196
51197       if (typeof process === "object" &&
51198           process.toString() === "[object process]" && process.nextTick) {
51199           // Ensure Q is in a real Node environment, with a `process.nextTick`.
51200           // To see through fake Node environments:
51201           // * Mocha test runner - exposes a `process` global without a `nextTick`
51202           // * Browserify - exposes a `process.nexTick` function that uses
51203           //   `setTimeout`. In this case `setImmediate` is preferred because
51204           //    it is faster. Browserify's `process.toString()` yields
51205           //   "[object Object]", while in a real Node environment
51206           //   `process.toString()` yields "[object process]".
51207           isNodeJS = true;
51208
51209           requestTick = function () {
51210               process.nextTick(flush);
51211           };
51212
51213       } else if (typeof setImmediate === "function") {
51214           // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate
51215           if (typeof window !== "undefined") {
51216               requestTick = setImmediate.bind(window, flush);
51217           } else {
51218               requestTick = function () {
51219                   setImmediate(flush);
51220               };
51221           }
51222
51223       } else if (typeof MessageChannel !== "undefined") {
51224           // modern browsers
51225           // http://www.nonblocking.io/2011/06/windownexttick.html
51226           var channel = new MessageChannel();
51227           // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
51228           // working message ports the first time a page loads.
51229           channel.port1.onmessage = function () {
51230               requestTick = requestPortTick;
51231               channel.port1.onmessage = flush;
51232               flush();
51233           };
51234           var requestPortTick = function () {
51235               // Opera requires us to provide a message payload, regardless of
51236               // whether we use it.
51237               channel.port2.postMessage(0);
51238           };
51239           requestTick = function () {
51240               setTimeout(flush, 0);
51241               requestPortTick();
51242           };
51243
51244       } else {
51245           // old browsers
51246           requestTick = function () {
51247               setTimeout(flush, 0);
51248           };
51249       }
51250       // runs a task after all other tasks have been run
51251       // this is useful for unhandled rejection tracking that needs to happen
51252       // after all `then`d tasks have been run.
51253       nextTick.runAfter = function (task) {
51254           laterQueue.push(task);
51255           if (!flushing) {
51256               flushing = true;
51257               requestTick();
51258           }
51259       };
51260       return nextTick;
51261   })();
51262
51263   // Attempt to make generics safe in the face of downstream
51264   // modifications.
51265   // There is no situation where this is necessary.
51266   // If you need a security guarantee, these primordials need to be
51267   // deeply frozen anyway, and if you don’t need a security guarantee,
51268   // this is just plain paranoid.
51269   // However, this **might** have the nice side-effect of reducing the size of
51270   // the minified code by reducing x.call() to merely x()
51271   // See Mark Miller’s explanation of what this does.
51272   // http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
51273   var call = Function.call;
51274   function uncurryThis(f) {
51275       return function () {
51276           return call.apply(f, arguments);
51277       };
51278   }
51279   // This is equivalent, but slower:
51280   // uncurryThis = Function_bind.bind(Function_bind.call);
51281   // http://jsperf.com/uncurrythis
51282
51283   var array_slice = uncurryThis(Array.prototype.slice);
51284
51285   var array_reduce = uncurryThis(
51286       Array.prototype.reduce || function (callback, basis) {
51287           var index = 0,
51288               length = this.length;
51289           // concerning the initial value, if one is not provided
51290           if (arguments.length === 1) {
51291               // seek to the first value in the array, accounting
51292               // for the possibility that is is a sparse array
51293               do {
51294                   if (index in this) {
51295                       basis = this[index++];
51296                       break;
51297                   }
51298                   if (++index >= length) {
51299                       throw new TypeError();
51300                   }
51301               } while (1);
51302           }
51303           // reduce
51304           for (; index < length; index++) {
51305               // account for the possibility that the array is sparse
51306               if (index in this) {
51307                   basis = callback(basis, this[index], index);
51308               }
51309           }
51310           return basis;
51311       }
51312   );
51313
51314   var array_indexOf = uncurryThis(
51315       Array.prototype.indexOf || function (value) {
51316           // not a very good shim, but good enough for our one use of it
51317           for (var i = 0; i < this.length; i++) {
51318               if (this[i] === value) {
51319                   return i;
51320               }
51321           }
51322           return -1;
51323       }
51324   );
51325
51326   var array_map = uncurryThis(
51327       Array.prototype.map || function (callback, thisp) {
51328           var self = this;
51329           var collect = [];
51330           array_reduce(self, function (undefined$1, value, index) {
51331               collect.push(callback.call(thisp, value, index, self));
51332           }, void 0);
51333           return collect;
51334       }
51335   );
51336
51337   var object_create = Object.create || function (prototype) {
51338       function Type() { }
51339       Type.prototype = prototype;
51340       return new Type();
51341   };
51342
51343   var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {
51344       obj[prop] = descriptor.value;
51345       return obj;
51346   };
51347
51348   var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
51349
51350   var object_keys = Object.keys || function (object) {
51351       var keys = [];
51352       for (var key in object) {
51353           if (object_hasOwnProperty(object, key)) {
51354               keys.push(key);
51355           }
51356       }
51357       return keys;
51358   };
51359
51360   var object_toString = uncurryThis(Object.prototype.toString);
51361
51362   function isObject(value) {
51363       return value === Object(value);
51364   }
51365
51366   // generator related shims
51367
51368   // FIXME: Remove this function once ES6 generators are in SpiderMonkey.
51369   function isStopIteration(exception) {
51370       return (
51371           object_toString(exception) === "[object StopIteration]" ||
51372           exception instanceof QReturnValue
51373       );
51374   }
51375
51376   // FIXME: Remove this helper and Q.return once ES6 generators are in
51377   // SpiderMonkey.
51378   var QReturnValue;
51379   if (typeof ReturnValue !== "undefined") {
51380       QReturnValue = ReturnValue;
51381   } else {
51382       QReturnValue = function (value) {
51383           this.value = value;
51384       };
51385   }
51386
51387   // long stack traces
51388
51389   var STACK_JUMP_SEPARATOR = "From previous event:";
51390
51391   function makeStackTraceLong(error, promise) {
51392       // If possible, transform the error stack trace by removing Node and Q
51393       // cruft, then concatenating with the stack trace of `promise`. See #57.
51394       if (hasStacks &&
51395           promise.stack &&
51396           typeof error === "object" &&
51397           error !== null &&
51398           error.stack
51399       ) {
51400           var stacks = [];
51401           for (var p = promise; !!p; p = p.source) {
51402               if (p.stack && (!error.__minimumStackCounter__ || error.__minimumStackCounter__ > p.stackCounter)) {
51403                   object_defineProperty(error, "__minimumStackCounter__", {value: p.stackCounter, configurable: true});
51404                   stacks.unshift(p.stack);
51405               }
51406           }
51407           stacks.unshift(error.stack);
51408
51409           var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
51410           var stack = filterStackString(concatedStacks);
51411           object_defineProperty(error, "stack", {value: stack, configurable: true});
51412       }
51413   }
51414
51415   function filterStackString(stackString) {
51416       var lines = stackString.split("\n");
51417       var desiredLines = [];
51418       for (var i = 0; i < lines.length; ++i) {
51419           var line = lines[i];
51420
51421           if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
51422               desiredLines.push(line);
51423           }
51424       }
51425       return desiredLines.join("\n");
51426   }
51427
51428   function isNodeFrame(stackLine) {
51429       return stackLine.indexOf("(module.js:") !== -1 ||
51430              stackLine.indexOf("(node.js:") !== -1;
51431   }
51432
51433   function getFileNameAndLineNumber(stackLine) {
51434       // Named functions: "at functionName (filename:lineNumber:columnNumber)"
51435       // In IE10 function name can have spaces ("Anonymous function") O_o
51436       var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
51437       if (attempt1) {
51438           return [attempt1[1], Number(attempt1[2])];
51439       }
51440
51441       // Anonymous functions: "at filename:lineNumber:columnNumber"
51442       var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
51443       if (attempt2) {
51444           return [attempt2[1], Number(attempt2[2])];
51445       }
51446
51447       // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
51448       var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
51449       if (attempt3) {
51450           return [attempt3[1], Number(attempt3[2])];
51451       }
51452   }
51453
51454   function isInternalFrame(stackLine) {
51455       var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
51456
51457       if (!fileNameAndLineNumber) {
51458           return false;
51459       }
51460
51461       var fileName = fileNameAndLineNumber[0];
51462       var lineNumber = fileNameAndLineNumber[1];
51463
51464       return fileName === qFileName &&
51465           lineNumber >= qStartingLine &&
51466           lineNumber <= qEndingLine;
51467   }
51468
51469   // discover own file name and line number range for filtering stack
51470   // traces
51471   function captureLine() {
51472       if (!hasStacks) {
51473           return;
51474       }
51475
51476       try {
51477           throw new Error();
51478       } catch (e) {
51479           var lines = e.stack.split("\n");
51480           var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
51481           var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
51482           if (!fileNameAndLineNumber) {
51483               return;
51484           }
51485
51486           qFileName = fileNameAndLineNumber[0];
51487           return fileNameAndLineNumber[1];
51488       }
51489   }
51490
51491   function deprecate(callback, name, alternative) {
51492       return function () {
51493           if (typeof console !== "undefined" &&
51494               typeof console.warn === "function") {
51495               console.warn(name + " is deprecated, use " + alternative +
51496                            " instead.", new Error("").stack);
51497           }
51498           return callback.apply(callback, arguments);
51499       };
51500   }
51501
51502   // end of shims
51503   // beginning of real work
51504
51505   /**
51506    * Constructs a promise for an immediate reference, passes promises through, or
51507    * coerces promises from different systems.
51508    * @param value immediate reference or promise
51509    */
51510   function Q(value) {
51511       // If the object is already a Promise, return it directly.  This enables
51512       // the resolve function to both be used to created references from objects,
51513       // but to tolerably coerce non-promises to promises.
51514       if (value instanceof Promise) {
51515           return value;
51516       }
51517
51518       // assimilate thenables
51519       if (isPromiseAlike(value)) {
51520           return coerce(value);
51521       } else {
51522           return fulfill(value);
51523       }
51524   }
51525   Q.resolve = Q;
51526
51527   /**
51528    * Performs a task in a future turn of the event loop.
51529    * @param {Function} task
51530    */
51531   Q.nextTick = nextTick;
51532
51533   /**
51534    * Controls whether or not long stack traces will be on
51535    */
51536   Q.longStackSupport = false;
51537
51538   /**
51539    * The counter is used to determine the stopping point for building
51540    * long stack traces. In makeStackTraceLong we walk backwards through
51541    * the linked list of promises, only stacks which were created before
51542    * the rejection are concatenated.
51543    */
51544   var longStackCounter = 1;
51545
51546   // enable long stacks if Q_DEBUG is set
51547   if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
51548       Q.longStackSupport = true;
51549   }
51550
51551   /**
51552    * Constructs a {promise, resolve, reject} object.
51553    *
51554    * `resolve` is a callback to invoke with a more resolved value for the
51555    * promise. To fulfill the promise, invoke `resolve` with any value that is
51556    * not a thenable. To reject the promise, invoke `resolve` with a rejected
51557    * thenable, or invoke `reject` with the reason directly. To resolve the
51558    * promise to another thenable, thus putting it in the same state, invoke
51559    * `resolve` with that other thenable.
51560    */
51561   Q.defer = defer;
51562   function defer() {
51563       // if "messages" is an "Array", that indicates that the promise has not yet
51564       // been resolved.  If it is "undefined", it has been resolved.  Each
51565       // element of the messages array is itself an array of complete arguments to
51566       // forward to the resolved promise.  We coerce the resolution value to a
51567       // promise using the `resolve` function because it handles both fully
51568       // non-thenable values and other thenables gracefully.
51569       var messages = [], progressListeners = [], resolvedPromise;
51570
51571       var deferred = object_create(defer.prototype);
51572       var promise = object_create(Promise.prototype);
51573
51574       promise.promiseDispatch = function (resolve, op, operands) {
51575           var args = array_slice(arguments);
51576           if (messages) {
51577               messages.push(args);
51578               if (op === "when" && operands[1]) { // progress operand
51579                   progressListeners.push(operands[1]);
51580               }
51581           } else {
51582               Q.nextTick(function () {
51583                   resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
51584               });
51585           }
51586       };
51587
51588       // XXX deprecated
51589       promise.valueOf = function () {
51590           if (messages) {
51591               return promise;
51592           }
51593           var nearerValue = nearer(resolvedPromise);
51594           if (isPromise(nearerValue)) {
51595               resolvedPromise = nearerValue; // shorten chain
51596           }
51597           return nearerValue;
51598       };
51599
51600       promise.inspect = function () {
51601           if (!resolvedPromise) {
51602               return { state: "pending" };
51603           }
51604           return resolvedPromise.inspect();
51605       };
51606
51607       if (Q.longStackSupport && hasStacks) {
51608           try {
51609               throw new Error();
51610           } catch (e) {
51611               // NOTE: don't try to use `Error.captureStackTrace` or transfer the
51612               // accessor around; that causes memory leaks as per GH-111. Just
51613               // reify the stack trace as a string ASAP.
51614               //
51615               // At the same time, cut off the first line; it's always just
51616               // "[object Promise]\n", as per the `toString`.
51617               promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
51618               promise.stackCounter = longStackCounter++;
51619           }
51620       }
51621
51622       // NOTE: we do the checks for `resolvedPromise` in each method, instead of
51623       // consolidating them into `become`, since otherwise we'd create new
51624       // promises with the lines `become(whatever(value))`. See e.g. GH-252.
51625
51626       function become(newPromise) {
51627           resolvedPromise = newPromise;
51628
51629           if (Q.longStackSupport && hasStacks) {
51630               // Only hold a reference to the new promise if long stacks
51631               // are enabled to reduce memory usage
51632               promise.source = newPromise;
51633           }
51634
51635           array_reduce(messages, function (undefined$1, message) {
51636               Q.nextTick(function () {
51637                   newPromise.promiseDispatch.apply(newPromise, message);
51638               });
51639           }, void 0);
51640
51641           messages = void 0;
51642           progressListeners = void 0;
51643       }
51644
51645       deferred.promise = promise;
51646       deferred.resolve = function (value) {
51647           if (resolvedPromise) {
51648               return;
51649           }
51650
51651           become(Q(value));
51652       };
51653
51654       deferred.fulfill = function (value) {
51655           if (resolvedPromise) {
51656               return;
51657           }
51658
51659           become(fulfill(value));
51660       };
51661       deferred.reject = function (reason) {
51662           if (resolvedPromise) {
51663               return;
51664           }
51665
51666           become(reject(reason));
51667       };
51668       deferred.notify = function (progress) {
51669           if (resolvedPromise) {
51670               return;
51671           }
51672
51673           array_reduce(progressListeners, function (undefined$1, progressListener) {
51674               Q.nextTick(function () {
51675                   progressListener(progress);
51676               });
51677           }, void 0);
51678       };
51679
51680       return deferred;
51681   }
51682
51683   /**
51684    * Creates a Node-style callback that will resolve or reject the deferred
51685    * promise.
51686    * @returns a nodeback
51687    */
51688   defer.prototype.makeNodeResolver = function () {
51689       var self = this;
51690       return function (error, value) {
51691           if (error) {
51692               self.reject(error);
51693           } else if (arguments.length > 2) {
51694               self.resolve(array_slice(arguments, 1));
51695           } else {
51696               self.resolve(value);
51697           }
51698       };
51699   };
51700
51701   /**
51702    * @param resolver {Function} a function that returns nothing and accepts
51703    * the resolve, reject, and notify functions for a deferred.
51704    * @returns a promise that may be resolved with the given resolve and reject
51705    * functions, or rejected by a thrown exception in resolver
51706    */
51707   Q.Promise = promise; // ES6
51708   Q.promise = promise;
51709   function promise(resolver) {
51710       if (typeof resolver !== "function") {
51711           throw new TypeError("resolver must be a function.");
51712       }
51713       var deferred = defer();
51714       try {
51715           resolver(deferred.resolve, deferred.reject, deferred.notify);
51716       } catch (reason) {
51717           deferred.reject(reason);
51718       }
51719       return deferred.promise;
51720   }
51721
51722   promise.race = race; // ES6
51723   promise.all = all; // ES6
51724   promise.reject = reject; // ES6
51725   promise.resolve = Q; // ES6
51726
51727   // XXX experimental.  This method is a way to denote that a local value is
51728   // serializable and should be immediately dispatched to a remote upon request,
51729   // instead of passing a reference.
51730   Q.passByCopy = function (object) {
51731       //freeze(object);
51732       //passByCopies.set(object, true);
51733       return object;
51734   };
51735
51736   Promise.prototype.passByCopy = function () {
51737       //freeze(object);
51738       //passByCopies.set(object, true);
51739       return this;
51740   };
51741
51742   /**
51743    * If two promises eventually fulfill to the same value, promises that value,
51744    * but otherwise rejects.
51745    * @param x {Any*}
51746    * @param y {Any*}
51747    * @returns {Any*} a promise for x and y if they are the same, but a rejection
51748    * otherwise.
51749    *
51750    */
51751   Q.join = function (x, y) {
51752       return Q(x).join(y);
51753   };
51754
51755   Promise.prototype.join = function (that) {
51756       return Q([this, that]).spread(function (x, y) {
51757           if (x === y) {
51758               // TODO: "===" should be Object.is or equiv
51759               return x;
51760           } else {
51761               throw new Error("Q can't join: not the same: " + x + " " + y);
51762           }
51763       });
51764   };
51765
51766   /**
51767    * Returns a promise for the first of an array of promises to become settled.
51768    * @param answers {Array[Any*]} promises to race
51769    * @returns {Any*} the first promise to be settled
51770    */
51771   Q.race = race;
51772   function race(answerPs) {
51773       return promise(function (resolve, reject) {
51774           // Switch to this once we can assume at least ES5
51775           // answerPs.forEach(function (answerP) {
51776           //     Q(answerP).then(resolve, reject);
51777           // });
51778           // Use this in the meantime
51779           for (var i = 0, len = answerPs.length; i < len; i++) {
51780               Q(answerPs[i]).then(resolve, reject);
51781           }
51782       });
51783   }
51784
51785   Promise.prototype.race = function () {
51786       return this.then(Q.race);
51787   };
51788
51789   /**
51790    * Constructs a Promise with a promise descriptor object and optional fallback
51791    * function.  The descriptor contains methods like when(rejected), get(name),
51792    * set(name, value), post(name, args), and delete(name), which all
51793    * return either a value, a promise for a value, or a rejection.  The fallback
51794    * accepts the operation name, a resolver, and any further arguments that would
51795    * have been forwarded to the appropriate method above had a method been
51796    * provided with the proper name.  The API makes no guarantees about the nature
51797    * of the returned object, apart from that it is usable whereever promises are
51798    * bought and sold.
51799    */
51800   Q.makePromise = Promise;
51801   function Promise(descriptor, fallback, inspect) {
51802       if (fallback === void 0) {
51803           fallback = function (op) {
51804               return reject(new Error(
51805                   "Promise does not support operation: " + op
51806               ));
51807           };
51808       }
51809       if (inspect === void 0) {
51810           inspect = function () {
51811               return {state: "unknown"};
51812           };
51813       }
51814
51815       var promise = object_create(Promise.prototype);
51816
51817       promise.promiseDispatch = function (resolve, op, args) {
51818           var result;
51819           try {
51820               if (descriptor[op]) {
51821                   result = descriptor[op].apply(promise, args);
51822               } else {
51823                   result = fallback.call(promise, op, args);
51824               }
51825           } catch (exception) {
51826               result = reject(exception);
51827           }
51828           if (resolve) {
51829               resolve(result);
51830           }
51831       };
51832
51833       promise.inspect = inspect;
51834
51835       // XXX deprecated `valueOf` and `exception` support
51836       if (inspect) {
51837           var inspected = inspect();
51838           if (inspected.state === "rejected") {
51839               promise.exception = inspected.reason;
51840           }
51841
51842           promise.valueOf = function () {
51843               var inspected = inspect();
51844               if (inspected.state === "pending" ||
51845                   inspected.state === "rejected") {
51846                   return promise;
51847               }
51848               return inspected.value;
51849           };
51850       }
51851
51852       return promise;
51853   }
51854
51855   Promise.prototype.toString = function () {
51856       return "[object Promise]";
51857   };
51858
51859   Promise.prototype.then = function (fulfilled, rejected, progressed) {
51860       var self = this;
51861       var deferred = defer();
51862       var done = false;   // ensure the untrusted promise makes at most a
51863                           // single call to one of the callbacks
51864
51865       function _fulfilled(value) {
51866           try {
51867               return typeof fulfilled === "function" ? fulfilled(value) : value;
51868           } catch (exception) {
51869               return reject(exception);
51870           }
51871       }
51872
51873       function _rejected(exception) {
51874           if (typeof rejected === "function") {
51875               makeStackTraceLong(exception, self);
51876               try {
51877                   return rejected(exception);
51878               } catch (newException) {
51879                   return reject(newException);
51880               }
51881           }
51882           return reject(exception);
51883       }
51884
51885       function _progressed(value) {
51886           return typeof progressed === "function" ? progressed(value) : value;
51887       }
51888
51889       Q.nextTick(function () {
51890           self.promiseDispatch(function (value) {
51891               if (done) {
51892                   return;
51893               }
51894               done = true;
51895
51896               deferred.resolve(_fulfilled(value));
51897           }, "when", [function (exception) {
51898               if (done) {
51899                   return;
51900               }
51901               done = true;
51902
51903               deferred.resolve(_rejected(exception));
51904           }]);
51905       });
51906
51907       // Progress propagator need to be attached in the current tick.
51908       self.promiseDispatch(void 0, "when", [void 0, function (value) {
51909           var newValue;
51910           var threw = false;
51911           try {
51912               newValue = _progressed(value);
51913           } catch (e) {
51914               threw = true;
51915               if (Q.onerror) {
51916                   Q.onerror(e);
51917               } else {
51918                   throw e;
51919               }
51920           }
51921
51922           if (!threw) {
51923               deferred.notify(newValue);
51924           }
51925       }]);
51926
51927       return deferred.promise;
51928   };
51929
51930   Q.tap = function (promise, callback) {
51931       return Q(promise).tap(callback);
51932   };
51933
51934   /**
51935    * Works almost like "finally", but not called for rejections.
51936    * Original resolution value is passed through callback unaffected.
51937    * Callback may return a promise that will be awaited for.
51938    * @param {Function} callback
51939    * @returns {Q.Promise}
51940    * @example
51941    * doSomething()
51942    *   .then(...)
51943    *   .tap(console.log)
51944    *   .then(...);
51945    */
51946   Promise.prototype.tap = function (callback) {
51947       callback = Q(callback);
51948
51949       return this.then(function (value) {
51950           return callback.fcall(value).thenResolve(value);
51951       });
51952   };
51953
51954   /**
51955    * Registers an observer on a promise.
51956    *
51957    * Guarantees:
51958    *
51959    * 1. that fulfilled and rejected will be called only once.
51960    * 2. that either the fulfilled callback or the rejected callback will be
51961    *    called, but not both.
51962    * 3. that fulfilled and rejected will not be called in this turn.
51963    *
51964    * @param value      promise or immediate reference to observe
51965    * @param fulfilled  function to be called with the fulfilled value
51966    * @param rejected   function to be called with the rejection exception
51967    * @param progressed function to be called on any progress notifications
51968    * @return promise for the return value from the invoked callback
51969    */
51970   Q.when = when;
51971   function when(value, fulfilled, rejected, progressed) {
51972       return Q(value).then(fulfilled, rejected, progressed);
51973   }
51974
51975   Promise.prototype.thenResolve = function (value) {
51976       return this.then(function () { return value; });
51977   };
51978
51979   Q.thenResolve = function (promise, value) {
51980       return Q(promise).thenResolve(value);
51981   };
51982
51983   Promise.prototype.thenReject = function (reason) {
51984       return this.then(function () { throw reason; });
51985   };
51986
51987   Q.thenReject = function (promise, reason) {
51988       return Q(promise).thenReject(reason);
51989   };
51990
51991   /**
51992    * If an object is not a promise, it is as "near" as possible.
51993    * If a promise is rejected, it is as "near" as possible too.
51994    * If it’s a fulfilled promise, the fulfillment value is nearer.
51995    * If it’s a deferred promise and the deferred has been resolved, the
51996    * resolution is "nearer".
51997    * @param object
51998    * @returns most resolved (nearest) form of the object
51999    */
52000
52001   // XXX should we re-do this?
52002   Q.nearer = nearer;
52003   function nearer(value) {
52004       if (isPromise(value)) {
52005           var inspected = value.inspect();
52006           if (inspected.state === "fulfilled") {
52007               return inspected.value;
52008           }
52009       }
52010       return value;
52011   }
52012
52013   /**
52014    * @returns whether the given object is a promise.
52015    * Otherwise it is a fulfilled value.
52016    */
52017   Q.isPromise = isPromise;
52018   function isPromise(object) {
52019       return object instanceof Promise;
52020   }
52021
52022   Q.isPromiseAlike = isPromiseAlike;
52023   function isPromiseAlike(object) {
52024       return isObject(object) && typeof object.then === "function";
52025   }
52026
52027   /**
52028    * @returns whether the given object is a pending promise, meaning not
52029    * fulfilled or rejected.
52030    */
52031   Q.isPending = isPending;
52032   function isPending(object) {
52033       return isPromise(object) && object.inspect().state === "pending";
52034   }
52035
52036   Promise.prototype.isPending = function () {
52037       return this.inspect().state === "pending";
52038   };
52039
52040   /**
52041    * @returns whether the given object is a value or fulfilled
52042    * promise.
52043    */
52044   Q.isFulfilled = isFulfilled;
52045   function isFulfilled(object) {
52046       return !isPromise(object) || object.inspect().state === "fulfilled";
52047   }
52048
52049   Promise.prototype.isFulfilled = function () {
52050       return this.inspect().state === "fulfilled";
52051   };
52052
52053   /**
52054    * @returns whether the given object is a rejected promise.
52055    */
52056   Q.isRejected = isRejected;
52057   function isRejected(object) {
52058       return isPromise(object) && object.inspect().state === "rejected";
52059   }
52060
52061   Promise.prototype.isRejected = function () {
52062       return this.inspect().state === "rejected";
52063   };
52064
52065   //// BEGIN UNHANDLED REJECTION TRACKING
52066
52067   // This promise library consumes exceptions thrown in handlers so they can be
52068   // handled by a subsequent promise.  The exceptions get added to this array when
52069   // they are created, and removed when they are handled.  Note that in ES6 or
52070   // shimmed environments, this would naturally be a `Set`.
52071   var unhandledReasons = [];
52072   var unhandledRejections = [];
52073   var reportedUnhandledRejections = [];
52074   var trackUnhandledRejections = true;
52075
52076   function resetUnhandledRejections() {
52077       unhandledReasons.length = 0;
52078       unhandledRejections.length = 0;
52079
52080       if (!trackUnhandledRejections) {
52081           trackUnhandledRejections = true;
52082       }
52083   }
52084
52085   function trackRejection(promise, reason) {
52086       if (!trackUnhandledRejections) {
52087           return;
52088       }
52089       if (typeof process === "object" && typeof process.emit === "function") {
52090           Q.nextTick.runAfter(function () {
52091               if (array_indexOf(unhandledRejections, promise) !== -1) {
52092                   process.emit("unhandledRejection", reason, promise);
52093                   reportedUnhandledRejections.push(promise);
52094               }
52095           });
52096       }
52097
52098       unhandledRejections.push(promise);
52099       if (reason && typeof reason.stack !== "undefined") {
52100           unhandledReasons.push(reason.stack);
52101       } else {
52102           unhandledReasons.push("(no stack) " + reason);
52103       }
52104   }
52105
52106   function untrackRejection(promise) {
52107       if (!trackUnhandledRejections) {
52108           return;
52109       }
52110
52111       var at = array_indexOf(unhandledRejections, promise);
52112       if (at !== -1) {
52113           if (typeof process === "object" && typeof process.emit === "function") {
52114               Q.nextTick.runAfter(function () {
52115                   var atReport = array_indexOf(reportedUnhandledRejections, promise);
52116                   if (atReport !== -1) {
52117                       process.emit("rejectionHandled", unhandledReasons[at], promise);
52118                       reportedUnhandledRejections.splice(atReport, 1);
52119                   }
52120               });
52121           }
52122           unhandledRejections.splice(at, 1);
52123           unhandledReasons.splice(at, 1);
52124       }
52125   }
52126
52127   Q.resetUnhandledRejections = resetUnhandledRejections;
52128
52129   Q.getUnhandledReasons = function () {
52130       // Make a copy so that consumers can't interfere with our internal state.
52131       return unhandledReasons.slice();
52132   };
52133
52134   Q.stopUnhandledRejectionTracking = function () {
52135       resetUnhandledRejections();
52136       trackUnhandledRejections = false;
52137   };
52138
52139   resetUnhandledRejections();
52140
52141   //// END UNHANDLED REJECTION TRACKING
52142
52143   /**
52144    * Constructs a rejected promise.
52145    * @param reason value describing the failure
52146    */
52147   Q.reject = reject;
52148   function reject(reason) {
52149       var rejection = Promise({
52150           "when": function (rejected) {
52151               // note that the error has been handled
52152               if (rejected) {
52153                   untrackRejection(this);
52154               }
52155               return rejected ? rejected(reason) : this;
52156           }
52157       }, function fallback() {
52158           return this;
52159       }, function inspect() {
52160           return { state: "rejected", reason: reason };
52161       });
52162
52163       // Note that the reason has not been handled.
52164       trackRejection(rejection, reason);
52165
52166       return rejection;
52167   }
52168
52169   /**
52170    * Constructs a fulfilled promise for an immediate reference.
52171    * @param value immediate reference
52172    */
52173   Q.fulfill = fulfill;
52174   function fulfill(value) {
52175       return Promise({
52176           "when": function () {
52177               return value;
52178           },
52179           "get": function (name) {
52180               return value[name];
52181           },
52182           "set": function (name, rhs) {
52183               value[name] = rhs;
52184           },
52185           "delete": function (name) {
52186               delete value[name];
52187           },
52188           "post": function (name, args) {
52189               // Mark Miller proposes that post with no name should apply a
52190               // promised function.
52191               if (name === null || name === void 0) {
52192                   return value.apply(void 0, args);
52193               } else {
52194                   return value[name].apply(value, args);
52195               }
52196           },
52197           "apply": function (thisp, args) {
52198               return value.apply(thisp, args);
52199           },
52200           "keys": function () {
52201               return object_keys(value);
52202           }
52203       }, void 0, function inspect() {
52204           return { state: "fulfilled", value: value };
52205       });
52206   }
52207
52208   /**
52209    * Converts thenables to Q promises.
52210    * @param promise thenable promise
52211    * @returns a Q promise
52212    */
52213   function coerce(promise) {
52214       var deferred = defer();
52215       Q.nextTick(function () {
52216           try {
52217               promise.then(deferred.resolve, deferred.reject, deferred.notify);
52218           } catch (exception) {
52219               deferred.reject(exception);
52220           }
52221       });
52222       return deferred.promise;
52223   }
52224
52225   /**
52226    * Annotates an object such that it will never be
52227    * transferred away from this process over any promise
52228    * communication channel.
52229    * @param object
52230    * @returns promise a wrapping of that object that
52231    * additionally responds to the "isDef" message
52232    * without a rejection.
52233    */
52234   Q.master = master;
52235   function master(object) {
52236       return Promise({
52237           "isDef": function () {}
52238       }, function fallback(op, args) {
52239           return dispatch(object, op, args);
52240       }, function () {
52241           return Q(object).inspect();
52242       });
52243   }
52244
52245   /**
52246    * Spreads the values of a promised array of arguments into the
52247    * fulfillment callback.
52248    * @param fulfilled callback that receives variadic arguments from the
52249    * promised array
52250    * @param rejected callback that receives the exception if the promise
52251    * is rejected.
52252    * @returns a promise for the return value or thrown exception of
52253    * either callback.
52254    */
52255   Q.spread = spread;
52256   function spread(value, fulfilled, rejected) {
52257       return Q(value).spread(fulfilled, rejected);
52258   }
52259
52260   Promise.prototype.spread = function (fulfilled, rejected) {
52261       return this.all().then(function (array) {
52262           return fulfilled.apply(void 0, array);
52263       }, rejected);
52264   };
52265
52266   /**
52267    * The async function is a decorator for generator functions, turning
52268    * them into asynchronous generators.  Although generators are only part
52269    * of the newest ECMAScript 6 drafts, this code does not cause syntax
52270    * errors in older engines.  This code should continue to work and will
52271    * in fact improve over time as the language improves.
52272    *
52273    * ES6 generators are currently part of V8 version 3.19 with the
52274    * --harmony-generators runtime flag enabled.  SpiderMonkey has had them
52275    * for longer, but under an older Python-inspired form.  This function
52276    * works on both kinds of generators.
52277    *
52278    * Decorates a generator function such that:
52279    *  - it may yield promises
52280    *  - execution will continue when that promise is fulfilled
52281    *  - the value of the yield expression will be the fulfilled value
52282    *  - it returns a promise for the return value (when the generator
52283    *    stops iterating)
52284    *  - the decorated function returns a promise for the return value
52285    *    of the generator or the first rejected promise among those
52286    *    yielded.
52287    *  - if an error is thrown in the generator, it propagates through
52288    *    every following yield until it is caught, or until it escapes
52289    *    the generator function altogether, and is translated into a
52290    *    rejection for the promise returned by the decorated generator.
52291    */
52292   Q.async = async;
52293   function async(makeGenerator) {
52294       return function () {
52295           // when verb is "send", arg is a value
52296           // when verb is "throw", arg is an exception
52297           function continuer(verb, arg) {
52298               var result;
52299
52300               // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only
52301               // engine that has a deployed base of browsers that support generators.
52302               // However, SM's generators use the Python-inspired semantics of
52303               // outdated ES6 drafts.  We would like to support ES6, but we'd also
52304               // like to make it possible to use generators in deployed browsers, so
52305               // we also support Python-style generators.  At some point we can remove
52306               // this block.
52307
52308               if (typeof StopIteration === "undefined") {
52309                   // ES6 Generators
52310                   try {
52311                       result = generator[verb](arg);
52312                   } catch (exception) {
52313                       return reject(exception);
52314                   }
52315                   if (result.done) {
52316                       return Q(result.value);
52317                   } else {
52318                       return when(result.value, callback, errback);
52319                   }
52320               } else {
52321                   // SpiderMonkey Generators
52322                   // FIXME: Remove this case when SM does ES6 generators.
52323                   try {
52324                       result = generator[verb](arg);
52325                   } catch (exception) {
52326                       if (isStopIteration(exception)) {
52327                           return Q(exception.value);
52328                       } else {
52329                           return reject(exception);
52330                       }
52331                   }
52332                   return when(result, callback, errback);
52333               }
52334           }
52335           var generator = makeGenerator.apply(this, arguments);
52336           var callback = continuer.bind(continuer, "next");
52337           var errback = continuer.bind(continuer, "throw");
52338           return callback();
52339       };
52340   }
52341
52342   /**
52343    * The spawn function is a small wrapper around async that immediately
52344    * calls the generator and also ends the promise chain, so that any
52345    * unhandled errors are thrown instead of forwarded to the error
52346    * handler. This is useful because it's extremely common to run
52347    * generators at the top-level to work with libraries.
52348    */
52349   Q.spawn = spawn;
52350   function spawn(makeGenerator) {
52351       Q.done(Q.async(makeGenerator)());
52352   }
52353
52354   // FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
52355   /**
52356    * Throws a ReturnValue exception to stop an asynchronous generator.
52357    *
52358    * This interface is a stop-gap measure to support generator return
52359    * values in older Firefox/SpiderMonkey.  In browsers that support ES6
52360    * generators like Chromium 29, just use "return" in your generator
52361    * functions.
52362    *
52363    * @param value the return value for the surrounding generator
52364    * @throws ReturnValue exception with the value.
52365    * @example
52366    * // ES6 style
52367    * Q.async(function* () {
52368    *      var foo = yield getFooPromise();
52369    *      var bar = yield getBarPromise();
52370    *      return foo + bar;
52371    * })
52372    * // Older SpiderMonkey style
52373    * Q.async(function () {
52374    *      var foo = yield getFooPromise();
52375    *      var bar = yield getBarPromise();
52376    *      Q.return(foo + bar);
52377    * })
52378    */
52379   Q["return"] = _return;
52380   function _return(value) {
52381       throw new QReturnValue(value);
52382   }
52383
52384   /**
52385    * The promised function decorator ensures that any promise arguments
52386    * are settled and passed as values (`this` is also settled and passed
52387    * as a value).  It will also ensure that the result of a function is
52388    * always a promise.
52389    *
52390    * @example
52391    * var add = Q.promised(function (a, b) {
52392    *     return a + b;
52393    * });
52394    * add(Q(a), Q(B));
52395    *
52396    * @param {function} callback The function to decorate
52397    * @returns {function} a function that has been decorated.
52398    */
52399   Q.promised = promised;
52400   function promised(callback) {
52401       return function () {
52402           return spread([this, all(arguments)], function (self, args) {
52403               return callback.apply(self, args);
52404           });
52405       };
52406   }
52407
52408   /**
52409    * sends a message to a value in a future turn
52410    * @param object* the recipient
52411    * @param op the name of the message operation, e.g., "when",
52412    * @param args further arguments to be forwarded to the operation
52413    * @returns result {Promise} a promise for the result of the operation
52414    */
52415   Q.dispatch = dispatch;
52416   function dispatch(object, op, args) {
52417       return Q(object).dispatch(op, args);
52418   }
52419
52420   Promise.prototype.dispatch = function (op, args) {
52421       var self = this;
52422       var deferred = defer();
52423       Q.nextTick(function () {
52424           self.promiseDispatch(deferred.resolve, op, args);
52425       });
52426       return deferred.promise;
52427   };
52428
52429   /**
52430    * Gets the value of a property in a future turn.
52431    * @param object    promise or immediate reference for target object
52432    * @param name      name of property to get
52433    * @return promise for the property value
52434    */
52435   Q.get = function (object, key) {
52436       return Q(object).dispatch("get", [key]);
52437   };
52438
52439   Promise.prototype.get = function (key) {
52440       return this.dispatch("get", [key]);
52441   };
52442
52443   /**
52444    * Sets the value of a property in a future turn.
52445    * @param object    promise or immediate reference for object object
52446    * @param name      name of property to set
52447    * @param value     new value of property
52448    * @return promise for the return value
52449    */
52450   Q.set = function (object, key, value) {
52451       return Q(object).dispatch("set", [key, value]);
52452   };
52453
52454   Promise.prototype.set = function (key, value) {
52455       return this.dispatch("set", [key, value]);
52456   };
52457
52458   /**
52459    * Deletes a property in a future turn.
52460    * @param object    promise or immediate reference for target object
52461    * @param name      name of property to delete
52462    * @return promise for the return value
52463    */
52464   Q.del = // XXX legacy
52465   Q["delete"] = function (object, key) {
52466       return Q(object).dispatch("delete", [key]);
52467   };
52468
52469   Promise.prototype.del = // XXX legacy
52470   Promise.prototype["delete"] = function (key) {
52471       return this.dispatch("delete", [key]);
52472   };
52473
52474   /**
52475    * Invokes a method in a future turn.
52476    * @param object    promise or immediate reference for target object
52477    * @param name      name of method to invoke
52478    * @param value     a value to post, typically an array of
52479    *                  invocation arguments for promises that
52480    *                  are ultimately backed with `resolve` values,
52481    *                  as opposed to those backed with URLs
52482    *                  wherein the posted value can be any
52483    *                  JSON serializable object.
52484    * @return promise for the return value
52485    */
52486   // bound locally because it is used by other methods
52487   Q.mapply = // XXX As proposed by "Redsandro"
52488   Q.post = function (object, name, args) {
52489       return Q(object).dispatch("post", [name, args]);
52490   };
52491
52492   Promise.prototype.mapply = // XXX As proposed by "Redsandro"
52493   Promise.prototype.post = function (name, args) {
52494       return this.dispatch("post", [name, args]);
52495   };
52496
52497   /**
52498    * Invokes a method in a future turn.
52499    * @param object    promise or immediate reference for target object
52500    * @param name      name of method to invoke
52501    * @param ...args   array of invocation arguments
52502    * @return promise for the return value
52503    */
52504   Q.send = // XXX Mark Miller's proposed parlance
52505   Q.mcall = // XXX As proposed by "Redsandro"
52506   Q.invoke = function (object, name /*...args*/) {
52507       return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);
52508   };
52509
52510   Promise.prototype.send = // XXX Mark Miller's proposed parlance
52511   Promise.prototype.mcall = // XXX As proposed by "Redsandro"
52512   Promise.prototype.invoke = function (name /*...args*/) {
52513       return this.dispatch("post", [name, array_slice(arguments, 1)]);
52514   };
52515
52516   /**
52517    * Applies the promised function in a future turn.
52518    * @param object    promise or immediate reference for target function
52519    * @param args      array of application arguments
52520    */
52521   Q.fapply = function (object, args) {
52522       return Q(object).dispatch("apply", [void 0, args]);
52523   };
52524
52525   Promise.prototype.fapply = function (args) {
52526       return this.dispatch("apply", [void 0, args]);
52527   };
52528
52529   /**
52530    * Calls the promised function in a future turn.
52531    * @param object    promise or immediate reference for target function
52532    * @param ...args   array of application arguments
52533    */
52534   Q["try"] =
52535   Q.fcall = function (object /* ...args*/) {
52536       return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
52537   };
52538
52539   Promise.prototype.fcall = function (/*...args*/) {
52540       return this.dispatch("apply", [void 0, array_slice(arguments)]);
52541   };
52542
52543   /**
52544    * Binds the promised function, transforming return values into a fulfilled
52545    * promise and thrown errors into a rejected one.
52546    * @param object    promise or immediate reference for target function
52547    * @param ...args   array of application arguments
52548    */
52549   Q.fbind = function (object /*...args*/) {
52550       var promise = Q(object);
52551       var args = array_slice(arguments, 1);
52552       return function fbound() {
52553           return promise.dispatch("apply", [
52554               this,
52555               args.concat(array_slice(arguments))
52556           ]);
52557       };
52558   };
52559   Promise.prototype.fbind = function (/*...args*/) {
52560       var promise = this;
52561       var args = array_slice(arguments);
52562       return function fbound() {
52563           return promise.dispatch("apply", [
52564               this,
52565               args.concat(array_slice(arguments))
52566           ]);
52567       };
52568   };
52569
52570   /**
52571    * Requests the names of the owned properties of a promised
52572    * object in a future turn.
52573    * @param object    promise or immediate reference for target object
52574    * @return promise for the keys of the eventually settled object
52575    */
52576   Q.keys = function (object) {
52577       return Q(object).dispatch("keys", []);
52578   };
52579
52580   Promise.prototype.keys = function () {
52581       return this.dispatch("keys", []);
52582   };
52583
52584   /**
52585    * Turns an array of promises into a promise for an array.  If any of
52586    * the promises gets rejected, the whole array is rejected immediately.
52587    * @param {Array*} an array (or promise for an array) of values (or
52588    * promises for values)
52589    * @returns a promise for an array of the corresponding values
52590    */
52591   // By Mark Miller
52592   // http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
52593   Q.all = all;
52594   function all(promises) {
52595       return when(promises, function (promises) {
52596           var pendingCount = 0;
52597           var deferred = defer();
52598           array_reduce(promises, function (undefined$1, promise, index) {
52599               var snapshot;
52600               if (
52601                   isPromise(promise) &&
52602                   (snapshot = promise.inspect()).state === "fulfilled"
52603               ) {
52604                   promises[index] = snapshot.value;
52605               } else {
52606                   ++pendingCount;
52607                   when(
52608                       promise,
52609                       function (value) {
52610                           promises[index] = value;
52611                           if (--pendingCount === 0) {
52612                               deferred.resolve(promises);
52613                           }
52614                       },
52615                       deferred.reject,
52616                       function (progress) {
52617                           deferred.notify({ index: index, value: progress });
52618                       }
52619                   );
52620               }
52621           }, void 0);
52622           if (pendingCount === 0) {
52623               deferred.resolve(promises);
52624           }
52625           return deferred.promise;
52626       });
52627   }
52628
52629   Promise.prototype.all = function () {
52630       return all(this);
52631   };
52632
52633   /**
52634    * Returns the first resolved promise of an array. Prior rejected promises are
52635    * ignored.  Rejects only if all promises are rejected.
52636    * @param {Array*} an array containing values or promises for values
52637    * @returns a promise fulfilled with the value of the first resolved promise,
52638    * or a rejected promise if all promises are rejected.
52639    */
52640   Q.any = any;
52641
52642   function any(promises) {
52643       if (promises.length === 0) {
52644           return Q.resolve();
52645       }
52646
52647       var deferred = Q.defer();
52648       var pendingCount = 0;
52649       array_reduce(promises, function (prev, current, index) {
52650           var promise = promises[index];
52651
52652           pendingCount++;
52653
52654           when(promise, onFulfilled, onRejected, onProgress);
52655           function onFulfilled(result) {
52656               deferred.resolve(result);
52657           }
52658           function onRejected(err) {
52659               pendingCount--;
52660               if (pendingCount === 0) {
52661                   var rejection = err || new Error("" + err);
52662
52663                   rejection.message = ("Q can't get fulfillment value from any promise, all " +
52664                       "promises were rejected. Last error message: " + rejection.message);
52665
52666                   deferred.reject(rejection);
52667               }
52668           }
52669           function onProgress(progress) {
52670               deferred.notify({
52671                   index: index,
52672                   value: progress
52673               });
52674           }
52675       }, undefined);
52676
52677       return deferred.promise;
52678   }
52679
52680   Promise.prototype.any = function () {
52681       return any(this);
52682   };
52683
52684   /**
52685    * Waits for all promises to be settled, either fulfilled or
52686    * rejected.  This is distinct from `all` since that would stop
52687    * waiting at the first rejection.  The promise returned by
52688    * `allResolved` will never be rejected.
52689    * @param promises a promise for an array (or an array) of promises
52690    * (or values)
52691    * @return a promise for an array of promises
52692    */
52693   Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");
52694   function allResolved(promises) {
52695       return when(promises, function (promises) {
52696           promises = array_map(promises, Q);
52697           return when(all(array_map(promises, function (promise) {
52698               return when(promise, noop, noop);
52699           })), function () {
52700               return promises;
52701           });
52702       });
52703   }
52704
52705   Promise.prototype.allResolved = function () {
52706       return allResolved(this);
52707   };
52708
52709   /**
52710    * @see Promise#allSettled
52711    */
52712   Q.allSettled = allSettled;
52713   function allSettled(promises) {
52714       return Q(promises).allSettled();
52715   }
52716
52717   /**
52718    * Turns an array of promises into a promise for an array of their states (as
52719    * returned by `inspect`) when they have all settled.
52720    * @param {Array[Any*]} values an array (or promise for an array) of values (or
52721    * promises for values)
52722    * @returns {Array[State]} an array of states for the respective values.
52723    */
52724   Promise.prototype.allSettled = function () {
52725       return this.then(function (promises) {
52726           return all(array_map(promises, function (promise) {
52727               promise = Q(promise);
52728               function regardless() {
52729                   return promise.inspect();
52730               }
52731               return promise.then(regardless, regardless);
52732           }));
52733       });
52734   };
52735
52736   /**
52737    * Captures the failure of a promise, giving an oportunity to recover
52738    * with a callback.  If the given promise is fulfilled, the returned
52739    * promise is fulfilled.
52740    * @param {Any*} promise for something
52741    * @param {Function} callback to fulfill the returned promise if the
52742    * given promise is rejected
52743    * @returns a promise for the return value of the callback
52744    */
52745   Q.fail = // XXX legacy
52746   Q["catch"] = function (object, rejected) {
52747       return Q(object).then(void 0, rejected);
52748   };
52749
52750   Promise.prototype.fail = // XXX legacy
52751   Promise.prototype["catch"] = function (rejected) {
52752       return this.then(void 0, rejected);
52753   };
52754
52755   /**
52756    * Attaches a listener that can respond to progress notifications from a
52757    * promise's originating deferred. This listener receives the exact arguments
52758    * passed to ``deferred.notify``.
52759    * @param {Any*} promise for something
52760    * @param {Function} callback to receive any progress notifications
52761    * @returns the given promise, unchanged
52762    */
52763   Q.progress = progress;
52764   function progress(object, progressed) {
52765       return Q(object).then(void 0, void 0, progressed);
52766   }
52767
52768   Promise.prototype.progress = function (progressed) {
52769       return this.then(void 0, void 0, progressed);
52770   };
52771
52772   /**
52773    * Provides an opportunity to observe the settling of a promise,
52774    * regardless of whether the promise is fulfilled or rejected.  Forwards
52775    * the resolution to the returned promise when the callback is done.
52776    * The callback can return a promise to defer completion.
52777    * @param {Any*} promise
52778    * @param {Function} callback to observe the resolution of the given
52779    * promise, takes no arguments.
52780    * @returns a promise for the resolution of the given promise when
52781    * ``fin`` is done.
52782    */
52783   Q.fin = // XXX legacy
52784   Q["finally"] = function (object, callback) {
52785       return Q(object)["finally"](callback);
52786   };
52787
52788   Promise.prototype.fin = // XXX legacy
52789   Promise.prototype["finally"] = function (callback) {
52790       if (!callback || typeof callback.apply !== "function") {
52791           throw new Error("Q can't apply finally callback");
52792       }
52793       callback = Q(callback);
52794       return this.then(function (value) {
52795           return callback.fcall().then(function () {
52796               return value;
52797           });
52798       }, function (reason) {
52799           // TODO attempt to recycle the rejection with "this".
52800           return callback.fcall().then(function () {
52801               throw reason;
52802           });
52803       });
52804   };
52805
52806   /**
52807    * Terminates a chain of promises, forcing rejections to be
52808    * thrown as exceptions.
52809    * @param {Any*} promise at the end of a chain of promises
52810    * @returns nothing
52811    */
52812   Q.done = function (object, fulfilled, rejected, progress) {
52813       return Q(object).done(fulfilled, rejected, progress);
52814   };
52815
52816   Promise.prototype.done = function (fulfilled, rejected, progress) {
52817       var onUnhandledError = function (error) {
52818           // forward to a future turn so that ``when``
52819           // does not catch it and turn it into a rejection.
52820           Q.nextTick(function () {
52821               makeStackTraceLong(error, promise);
52822               if (Q.onerror) {
52823                   Q.onerror(error);
52824               } else {
52825                   throw error;
52826               }
52827           });
52828       };
52829
52830       // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
52831       var promise = fulfilled || rejected || progress ?
52832           this.then(fulfilled, rejected, progress) :
52833           this;
52834
52835       if (typeof process === "object" && process && process.domain) {
52836           onUnhandledError = process.domain.bind(onUnhandledError);
52837       }
52838
52839       promise.then(void 0, onUnhandledError);
52840   };
52841
52842   /**
52843    * Causes a promise to be rejected if it does not get fulfilled before
52844    * some milliseconds time out.
52845    * @param {Any*} promise
52846    * @param {Number} milliseconds timeout
52847    * @param {Any*} custom error message or Error object (optional)
52848    * @returns a promise for the resolution of the given promise if it is
52849    * fulfilled before the timeout, otherwise rejected.
52850    */
52851   Q.timeout = function (object, ms, error) {
52852       return Q(object).timeout(ms, error);
52853   };
52854
52855   Promise.prototype.timeout = function (ms, error) {
52856       var deferred = defer();
52857       var timeoutId = setTimeout(function () {
52858           if (!error || "string" === typeof error) {
52859               error = new Error(error || "Timed out after " + ms + " ms");
52860               error.code = "ETIMEDOUT";
52861           }
52862           deferred.reject(error);
52863       }, ms);
52864
52865       this.then(function (value) {
52866           clearTimeout(timeoutId);
52867           deferred.resolve(value);
52868       }, function (exception) {
52869           clearTimeout(timeoutId);
52870           deferred.reject(exception);
52871       }, deferred.notify);
52872
52873       return deferred.promise;
52874   };
52875
52876   /**
52877    * Returns a promise for the given value (or promised value), some
52878    * milliseconds after it resolved. Passes rejections immediately.
52879    * @param {Any*} promise
52880    * @param {Number} milliseconds
52881    * @returns a promise for the resolution of the given promise after milliseconds
52882    * time has elapsed since the resolution of the given promise.
52883    * If the given promise rejects, that is passed immediately.
52884    */
52885   Q.delay = function (object, timeout) {
52886       if (timeout === void 0) {
52887           timeout = object;
52888           object = void 0;
52889       }
52890       return Q(object).delay(timeout);
52891   };
52892
52893   Promise.prototype.delay = function (timeout) {
52894       return this.then(function (value) {
52895           var deferred = defer();
52896           setTimeout(function () {
52897               deferred.resolve(value);
52898           }, timeout);
52899           return deferred.promise;
52900       });
52901   };
52902
52903   /**
52904    * Passes a continuation to a Node function, which is called with the given
52905    * arguments provided as an array, and returns a promise.
52906    *
52907    *      Q.nfapply(FS.readFile, [__filename])
52908    *      .then(function (content) {
52909    *      })
52910    *
52911    */
52912   Q.nfapply = function (callback, args) {
52913       return Q(callback).nfapply(args);
52914   };
52915
52916   Promise.prototype.nfapply = function (args) {
52917       var deferred = defer();
52918       var nodeArgs = array_slice(args);
52919       nodeArgs.push(deferred.makeNodeResolver());
52920       this.fapply(nodeArgs).fail(deferred.reject);
52921       return deferred.promise;
52922   };
52923
52924   /**
52925    * Passes a continuation to a Node function, which is called with the given
52926    * arguments provided individually, and returns a promise.
52927    * @example
52928    * Q.nfcall(FS.readFile, __filename)
52929    * .then(function (content) {
52930    * })
52931    *
52932    */
52933   Q.nfcall = function (callback /*...args*/) {
52934       var args = array_slice(arguments, 1);
52935       return Q(callback).nfapply(args);
52936   };
52937
52938   Promise.prototype.nfcall = function (/*...args*/) {
52939       var nodeArgs = array_slice(arguments);
52940       var deferred = defer();
52941       nodeArgs.push(deferred.makeNodeResolver());
52942       this.fapply(nodeArgs).fail(deferred.reject);
52943       return deferred.promise;
52944   };
52945
52946   /**
52947    * Wraps a NodeJS continuation passing function and returns an equivalent
52948    * version that returns a promise.
52949    * @example
52950    * Q.nfbind(FS.readFile, __filename)("utf-8")
52951    * .then(console.log)
52952    * .done()
52953    */
52954   Q.nfbind =
52955   Q.denodeify = function (callback /*...args*/) {
52956       if (callback === undefined) {
52957           throw new Error("Q can't wrap an undefined function");
52958       }
52959       var baseArgs = array_slice(arguments, 1);
52960       return function () {
52961           var nodeArgs = baseArgs.concat(array_slice(arguments));
52962           var deferred = defer();
52963           nodeArgs.push(deferred.makeNodeResolver());
52964           Q(callback).fapply(nodeArgs).fail(deferred.reject);
52965           return deferred.promise;
52966       };
52967   };
52968
52969   Promise.prototype.nfbind =
52970   Promise.prototype.denodeify = function (/*...args*/) {
52971       var args = array_slice(arguments);
52972       args.unshift(this);
52973       return Q.denodeify.apply(void 0, args);
52974   };
52975
52976   Q.nbind = function (callback, thisp /*...args*/) {
52977       var baseArgs = array_slice(arguments, 2);
52978       return function () {
52979           var nodeArgs = baseArgs.concat(array_slice(arguments));
52980           var deferred = defer();
52981           nodeArgs.push(deferred.makeNodeResolver());
52982           function bound() {
52983               return callback.apply(thisp, arguments);
52984           }
52985           Q(bound).fapply(nodeArgs).fail(deferred.reject);
52986           return deferred.promise;
52987       };
52988   };
52989
52990   Promise.prototype.nbind = function (/*thisp, ...args*/) {
52991       var args = array_slice(arguments, 0);
52992       args.unshift(this);
52993       return Q.nbind.apply(void 0, args);
52994   };
52995
52996   /**
52997    * Calls a method of a Node-style object that accepts a Node-style
52998    * callback with a given array of arguments, plus a provided callback.
52999    * @param object an object that has the named method
53000    * @param {String} name name of the method of object
53001    * @param {Array} args arguments to pass to the method; the callback
53002    * will be provided by Q and appended to these arguments.
53003    * @returns a promise for the value or error
53004    */
53005   Q.nmapply = // XXX As proposed by "Redsandro"
53006   Q.npost = function (object, name, args) {
53007       return Q(object).npost(name, args);
53008   };
53009
53010   Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
53011   Promise.prototype.npost = function (name, args) {
53012       var nodeArgs = array_slice(args || []);
53013       var deferred = defer();
53014       nodeArgs.push(deferred.makeNodeResolver());
53015       this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
53016       return deferred.promise;
53017   };
53018
53019   /**
53020    * Calls a method of a Node-style object that accepts a Node-style
53021    * callback, forwarding the given variadic arguments, plus a provided
53022    * callback argument.
53023    * @param object an object that has the named method
53024    * @param {String} name name of the method of object
53025    * @param ...args arguments to pass to the method; the callback will
53026    * be provided by Q and appended to these arguments.
53027    * @returns a promise for the value or error
53028    */
53029   Q.nsend = // XXX Based on Mark Miller's proposed "send"
53030   Q.nmcall = // XXX Based on "Redsandro's" proposal
53031   Q.ninvoke = function (object, name /*...args*/) {
53032       var nodeArgs = array_slice(arguments, 2);
53033       var deferred = defer();
53034       nodeArgs.push(deferred.makeNodeResolver());
53035       Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
53036       return deferred.promise;
53037   };
53038
53039   Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
53040   Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
53041   Promise.prototype.ninvoke = function (name /*...args*/) {
53042       var nodeArgs = array_slice(arguments, 1);
53043       var deferred = defer();
53044       nodeArgs.push(deferred.makeNodeResolver());
53045       this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
53046       return deferred.promise;
53047   };
53048
53049   /**
53050    * If a function would like to support both Node continuation-passing-style and
53051    * promise-returning-style, it can end its internal promise chain with
53052    * `nodeify(nodeback)`, forwarding the optional nodeback argument.  If the user
53053    * elects to use a nodeback, the result will be sent there.  If they do not
53054    * pass a nodeback, they will receive the result promise.
53055    * @param object a result (or a promise for a result)
53056    * @param {Function} nodeback a Node.js-style callback
53057    * @returns either the promise or nothing
53058    */
53059   Q.nodeify = nodeify;
53060   function nodeify(object, nodeback) {
53061       return Q(object).nodeify(nodeback);
53062   }
53063
53064   Promise.prototype.nodeify = function (nodeback) {
53065       if (nodeback) {
53066           this.then(function (value) {
53067               Q.nextTick(function () {
53068                   nodeback(null, value);
53069               });
53070           }, function (error) {
53071               Q.nextTick(function () {
53072                   nodeback(error);
53073               });
53074           });
53075       } else {
53076           return this;
53077       }
53078   };
53079
53080   Q.noConflict = function() {
53081       throw new Error("Q.noConflict only works when Q is used as a global");
53082   };
53083
53084   // All code before this point will be filtered from stack traces.
53085   var qEndingLine = captureLine();
53086
53087   return Q;
53088
53089   });
53090   });
53091
53092   var bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?';
53093   var streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/';
53094   var bubbleAppKey = 'AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm';
53095   var pannellumViewerCSS = 'pannellum-streetside/pannellum.css';
53096   var pannellumViewerJS = 'pannellum-streetside/pannellum.js';
53097   var maxResults$2 = 2000;
53098   var tileZoom$2 = 16.5;
53099   var tiler$5 = utilTiler().zoomExtent([tileZoom$2, tileZoom$2]).skipNullIsland(true);
53100   var dispatch$6 = dispatch('loadedBubbles', 'viewerChanged');
53101   var minHfov = 10;         // zoom in degrees:  20, 10, 5
53102   var maxHfov = 90;         // zoom out degrees
53103   var defaultHfov = 45;
53104
53105   var _hires = false;
53106   var _resolution = 512;    // higher numbers are slower - 512, 1024, 2048, 4096
53107   var _currScene = 0;
53108   var _ssCache;
53109   var _pannellumViewer;
53110   var _sceneOptions;
53111   var _dataUrlArray = [];
53112
53113
53114   /**
53115    * abortRequest().
53116    */
53117   function abortRequest$5(i) {
53118       i.abort();
53119   }
53120
53121
53122   /**
53123    * localeTimeStamp().
53124    */
53125   function localeTimestamp(s) {
53126       if (!s) return null;
53127       var detected = utilDetect();
53128       var options = { day: 'numeric', month: 'short', year: 'numeric' };
53129       var d = new Date(s);
53130       if (isNaN(d.getTime())) return null;
53131       return d.toLocaleString(detected.locale, options);
53132   }
53133
53134
53135   /**
53136    * loadTiles() wraps the process of generating tiles and then fetching image points for each tile.
53137    */
53138   function loadTiles$2(which, url, projection, margin) {
53139       var tiles = tiler$5.margin(margin).getTiles(projection);
53140
53141       // abort inflight requests that are no longer needed
53142       var cache = _ssCache[which];
53143       forEach(cache.inflight, function(v, k) {
53144           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
53145
53146           if (!wanted) {
53147               abortRequest$5(v);
53148               delete cache.inflight[k];
53149           }
53150       });
53151
53152       tiles.forEach(function (tile) {
53153          loadNextTilePage$2(which, url, tile);
53154       });
53155   }
53156
53157   /**
53158    * loadNextTilePage() load data for the next tile page in line.
53159    */
53160   function loadNextTilePage$2(which, url, tile) {
53161       var cache = _ssCache[which];
53162       var nextPage = cache.nextPage[tile.id] || 0;
53163       var id = tile.id + ',' + String(nextPage);
53164       if (cache.loaded[id] || cache.inflight[id]) return;
53165
53166       cache.inflight[id] = getBubbles(url, tile, function(bubbles) {
53167           cache.loaded[id] = true;
53168           delete cache.inflight[id];
53169           if (!bubbles) return;
53170
53171           // [].shift() removes the first element, some statistics info, not a bubble point
53172           bubbles.shift();
53173
53174           var features = bubbles.map(function(bubble) {
53175               if (cache.points[bubble.id]) return null;  // skip duplicates
53176
53177               var loc = [bubble.lo, bubble.la];
53178               var d = {
53179                   loc: loc,
53180                   key: bubble.id,
53181                   ca: bubble.he,
53182                   captured_at: bubble.cd,
53183                   captured_by: 'microsoft',
53184                   // nbn: bubble.nbn,
53185                   // pbn: bubble.pbn,
53186                   // ad: bubble.ad,
53187                   // rn: bubble.rn,
53188                   pr: bubble.pr,  // previous
53189                   ne: bubble.ne,  // next
53190                   pano: true,
53191                   sequenceKey: null
53192               };
53193
53194               cache.points[bubble.id] = d;
53195
53196               // a sequence starts here
53197               if (bubble.pr === undefined) {
53198                   cache.leaders.push(bubble.id);
53199               }
53200
53201               return {
53202                   minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
53203               };
53204
53205           }).filter(Boolean);
53206
53207           cache.rtree.load(features);
53208
53209           connectSequences();
53210
53211           if (which === 'bubbles') {
53212               dispatch$6.call('loadedBubbles');
53213           }
53214       });
53215   }
53216
53217
53218   // call this sometimes to connect the bubbles into sequences
53219   function connectSequences() {
53220       var cache = _ssCache.bubbles;
53221       var keepLeaders = [];
53222
53223       for (var i = 0; i < cache.leaders.length; i++) {
53224           var bubble = cache.points[cache.leaders[i]];
53225           var seen = {};
53226
53227           // try to make a sequence.. use the key of the leader bubble.
53228           var sequence = { key: bubble.key, bubbles: [] };
53229           var complete = false;
53230
53231           do {
53232               sequence.bubbles.push(bubble);
53233               seen[bubble.key] = true;
53234
53235               if (bubble.ne === undefined) {
53236                   complete = true;
53237               } else {
53238                   bubble = cache.points[bubble.ne];  // advance to next
53239               }
53240           } while (bubble && !seen[bubble.key] && !complete);
53241
53242
53243           if (complete) {
53244               _ssCache.sequences[sequence.key] = sequence;
53245
53246               // assign bubbles to the sequence
53247               for (var j = 0; j < sequence.bubbles.length; j++) {
53248                   sequence.bubbles[j].sequenceKey = sequence.key;
53249               }
53250
53251               // create a GeoJSON LineString
53252               sequence.geojson = {
53253                   type: 'LineString',
53254                   properties: { key: sequence.key },
53255                   coordinates: sequence.bubbles.map(function (d) { return d.loc; })
53256               };
53257
53258           } else {
53259               keepLeaders.push(cache.leaders[i]);
53260           }
53261       }
53262
53263       // couldn't complete these, save for later
53264       cache.leaders = keepLeaders;
53265   }
53266
53267   /**
53268    * getBubbles() handles the request to the server for a tile extent of 'bubbles' (streetside image locations).
53269    */
53270   function getBubbles(url, tile, callback) {
53271       var rect = tile.extent.rectangle();
53272       var urlForRequest = url + utilQsString({
53273           n: rect[3],
53274           s: rect[1],
53275           e: rect[2],
53276           w: rect[0],
53277           c: maxResults$2,
53278           appkey: bubbleAppKey,
53279           jsCallback: '{callback}'
53280       });
53281
53282       return jsonpRequest(urlForRequest, function (data) {
53283           if (!data || data.error) {
53284               callback(null);
53285           } else {
53286               callback(data);
53287           }
53288       });
53289   }
53290
53291
53292   // partition viewport into higher zoom tiles
53293   function partitionViewport$2(projection) {
53294       var z = geoScaleToZoom(projection.scale());
53295       var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
53296       var tiler = utilTiler().zoomExtent([z2, z2]);
53297
53298       return tiler.getTiles(projection)
53299           .map(function(tile) { return tile.extent; });
53300   }
53301
53302
53303   // no more than `limit` results per partition.
53304   function searchLimited$2(limit, projection, rtree) {
53305       limit = limit || 5;
53306
53307       return partitionViewport$2(projection)
53308           .reduce(function(result, extent) {
53309               var found = rtree.search(extent.bbox())
53310                   .slice(0, limit)
53311                   .map(function(d) { return d.data; });
53312
53313               return (found.length ? result.concat(found) : result);
53314           }, []);
53315   }
53316
53317
53318   /**
53319    * getImage()
53320    */
53321   function getImage(imgInfo) {
53322       var response = q.defer();
53323       var img = new Image();
53324
53325       img.onload = function() {
53326           var canvas = document.getElementById('canvas' + imgInfo.face);
53327           var ctx = canvas.getContext('2d');
53328           ctx.drawImage(img, imgInfo.x, imgInfo.y);
53329           response.resolve({imgInfo:imgInfo, status: 'ok'});
53330       };
53331       img.onerror = function() {
53332           response.resolve({data: imgInfo, status: 'error'});
53333       };
53334       img.setAttribute('crossorigin', '');
53335       img.src = imgInfo.url;
53336
53337       return response.promise;
53338   }
53339
53340
53341   /**
53342    * loadCanvas()
53343    */
53344   function loadCanvas(imgInfoGroup) {
53345       var response = q.defer();
53346       var getImagePromises = imgInfoGroup.map(function(imgInfo) {
53347           return getImage(imgInfo);
53348       });
53349
53350       q.all(getImagePromises).then(function(data) {
53351           var canvas = document.getElementById('canvas' + data[0].imgInfo.face);
53352           switch (data[0].imgInfo.face) {
53353               case '01':
53354                   _dataUrlArray[0] = canvas.toDataURL('image/jpeg', 1.0);
53355                   break;
53356               case '02':
53357                   _dataUrlArray[1] = canvas.toDataURL('image/jpeg', 1.0);
53358                   break;
53359               case '03':
53360                   _dataUrlArray[2] = canvas.toDataURL('image/jpeg', 1.0);
53361                   break;
53362               case '10':
53363                   _dataUrlArray[3] = canvas.toDataURL('image/jpeg', 1.0);
53364                   break;
53365               case '11':
53366                   _dataUrlArray[4] = canvas.toDataURL('image/jpeg', 1.0);
53367                   break;
53368               case '12':
53369                   _dataUrlArray[5] = canvas.toDataURL('image/jpeg', 1.0);
53370                   break;
53371           }
53372           response.resolve({status:'loadCanvas for face ' + data[0].imgInfo.face + 'ok'});
53373       });
53374
53375       return response.promise;
53376   }
53377
53378
53379   function setupCanvas(selection, reset) {
53380       if (reset) {
53381           selection.selectAll('#divForCanvasWork')
53382               .remove();
53383       }
53384
53385       // Add the Streetside working canvases. These are used for 'stitching', or combining,
53386       // multiple images for each of the six faces, before passing to the Pannellum control as DataUrls
53387       selection.selectAll('#divForCanvasWork')
53388           .data([0])
53389           .enter()
53390           .append('div')
53391           .attr('id', 'divForCanvasWork')
53392           .attr('display', 'none')
53393           .selectAll('canvas')
53394           .data(['canvas01', 'canvas02', 'canvas03', 'canvas10', 'canvas11', 'canvas12'])
53395           .enter()
53396           .append('canvas')
53397           .attr('id', function(d) { return d; })
53398           .attr('width', _resolution)
53399           .attr('height', _resolution);
53400   }
53401
53402
53403   /**
53404    * processFaces()
53405    */
53406   function processFaces(imgFaceInfoGroups) {
53407       var response = q.defer();
53408       var loadCanvasPromises = imgFaceInfoGroups.map(function(faceImgGroup) {
53409           return loadCanvas(faceImgGroup);
53410       });
53411
53412       q.all(loadCanvasPromises).then(function() {
53413           response.resolve({status: 'processFaces done'});
53414       });
53415
53416       return response.promise;
53417   }
53418
53419
53420
53421   function qkToXY(qk) {
53422       var x = 0;
53423       var y = 0;
53424       var scale = 256;
53425       for (var i = qk.length; i > 0; i--) {
53426           var key = qk[i-1];
53427           x += (+(key === '1' || key === '3')) * scale;
53428           y += (+(key === '2' || key === '3')) * scale;
53429           scale *= 2;
53430       }
53431       return [x, y];
53432   }
53433
53434
53435   function getQuadKeys() {
53436       var dim = _resolution / 256;
53437       var quadKeys;
53438
53439       if (dim === 16) {
53440           quadKeys = [
53441               '0000','0001','0010','0011','0100','0101','0110','0111',  '1000','1001','1010','1011','1100','1101','1110','1111',
53442               '0002','0003','0012','0013','0102','0103','0112','0113',  '1002','1003','1012','1013','1102','1103','1112','1113',
53443               '0020','0021','0030','0031','0120','0121','0130','0131',  '1020','1021','1030','1031','1120','1121','1130','1131',
53444               '0022','0023','0032','0033','0122','0123','0132','0133',  '1022','1023','1032','1033','1122','1123','1132','1133',
53445               '0200','0201','0210','0211','0300','0301','0310','0311',  '1200','1201','1210','1211','1300','1301','1310','1311',
53446               '0202','0203','0212','0213','0302','0303','0312','0313',  '1202','1203','1212','1213','1302','1303','1312','1313',
53447               '0220','0221','0230','0231','0320','0321','0330','0331',  '1220','1221','1230','1231','1320','1321','1330','1331',
53448               '0222','0223','0232','0233','0322','0323','0332','0333',  '1222','1223','1232','1233','1322','1323','1332','1333',
53449
53450               '2000','2001','2010','2011','2100','2101','2110','2111',  '3000','3001','3010','3011','3100','3101','3110','3111',
53451               '2002','2003','2012','2013','2102','2103','2112','2113',  '3002','3003','3012','3013','3102','3103','3112','3113',
53452               '2020','2021','2030','2031','2120','2121','2130','2131',  '3020','3021','3030','3031','3120','3121','3130','3131',
53453               '2022','2023','2032','2033','2122','2123','2132','2133',  '3022','3023','3032','3033','3122','3123','3132','3133',
53454               '2200','2201','2210','2211','2300','2301','2310','2311',  '3200','3201','3210','3211','3300','3301','3310','3311',
53455               '2202','2203','2212','2213','2302','2303','2312','2313',  '3202','3203','3212','3213','3302','3303','3312','3313',
53456               '2220','2221','2230','2231','2320','2321','2330','2331',  '3220','3221','3230','3231','3320','3321','3330','3331',
53457               '2222','2223','2232','2233','2322','2323','2332','2333',  '3222','3223','3232','3233','3322','3323','3332','3333'
53458           ];
53459
53460       } else if (dim === 8) {
53461           quadKeys = [
53462               '000','001','010','011',  '100','101','110','111',
53463               '002','003','012','013',  '102','103','112','113',
53464               '020','021','030','031',  '120','121','130','131',
53465               '022','023','032','033',  '122','123','132','133',
53466
53467               '200','201','210','211',  '300','301','310','311',
53468               '202','203','212','213',  '302','303','312','313',
53469               '220','221','230','231',  '320','321','330','331',
53470               '222','223','232','233',  '322','323','332','333'
53471           ];
53472
53473       } else if (dim === 4) {
53474           quadKeys = [
53475               '00','01',  '10','11',
53476               '02','03',  '12','13',
53477
53478               '20','21',  '30','31',
53479               '22','23',  '32','33'
53480           ];
53481
53482       } else {  // dim === 2
53483           quadKeys = [
53484               '0', '1',
53485               '2', '3'
53486           ];
53487       }
53488
53489       return quadKeys;
53490   }
53491
53492
53493
53494   var serviceStreetside = {
53495       /**
53496        * init() initialize streetside.
53497        */
53498       init: function () {
53499           if (!_ssCache) {
53500               this.reset();
53501           }
53502
53503           this.event = utilRebind(this, dispatch$6, 'on');
53504       },
53505
53506       /**
53507        * reset() reset the cache.
53508        */
53509       reset: function () {
53510           var cache = _ssCache;
53511
53512           if (cache) {
53513               if (cache.bubbles && cache.bubbles.inflight) {
53514                   forEach(cache.bubbles.inflight, abortRequest$5);
53515               }
53516           }
53517
53518           _ssCache = {
53519               bubbles: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1(), points: {}, leaders: [] },
53520               sequences: {}
53521           };
53522       },
53523
53524       /**
53525        * bubbles()
53526        */
53527       bubbles: function (projection) {
53528           var limit = 5;
53529           return searchLimited$2(limit, projection, _ssCache.bubbles.rtree);
53530       },
53531
53532
53533       sequences: function(projection) {
53534           var viewport = projection.clipExtent();
53535           var min = [viewport[0][0], viewport[1][1]];
53536           var max = [viewport[1][0], viewport[0][1]];
53537           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
53538           var seen = {};
53539           var results = [];
53540
53541           // all sequences for bubbles in viewport
53542           _ssCache.bubbles.rtree.search(bbox)
53543               .forEach(function(d) {
53544                   var key = d.data.sequenceKey;
53545                   if (key && !seen[key]) {
53546                       seen[key] = true;
53547                       results.push(_ssCache.sequences[key].geojson);
53548                   }
53549               });
53550
53551           return results;
53552       },
53553
53554
53555       /**
53556        * loadBubbles()
53557        */
53558       loadBubbles: function (projection, margin) {
53559           // by default: request 2 nearby tiles so we can connect sequences.
53560           if (margin === undefined) margin = 2;
53561
53562           loadTiles$2('bubbles', bubbleApi, projection, margin);
53563       },
53564
53565
53566       viewer: function() {
53567           return _pannellumViewer;
53568       },
53569
53570
53571       initViewer: function () {
53572           if (!window.pannellum) return;
53573           if (_pannellumViewer) return;
53574
53575           var sceneID = ++_currScene + '';
53576           var options = {
53577               'default': { firstScene: sceneID },
53578               scenes: {}
53579           };
53580           options.scenes[sceneID] = _sceneOptions;
53581
53582           _pannellumViewer = window.pannellum.viewer('viewer-streetside', options);
53583
53584           _pannellumViewer
53585               .on('mousedown', function() {
53586                   select(window).on('mousemove.pannellum', function() {
53587                       dispatch$6.call('viewerChanged');
53588                   });
53589               })
53590               .on('mouseup', function() {
53591                   select(window).on('mousemove.pannellum', null);
53592                   // continue dispatching events for a few seconds, in case viewer has inertia.
53593                   var t = timer(function(elapsed) {
53594                       dispatch$6.call('viewerChanged');
53595                       if (elapsed > 2000) {
53596                           t.stop();
53597                       }
53598                   });
53599               });
53600       },
53601
53602
53603       /**
53604        * loadViewer() create the streeside viewer.
53605        */
53606       loadViewer: function (context) {
53607           var that = this;
53608
53609           // create ms-wrapper, a photo wrapper class
53610           var wrap = select('#photoviewer').selectAll('.ms-wrapper')
53611               .data([0]);
53612
53613           // inject ms-wrapper into the photoviewer div
53614           // (used by all to house each custom photo viewer)
53615           var wrapEnter = wrap.enter()
53616               .append('div')
53617               .attr('id', 'ms')
53618               .attr('class', 'photo-wrapper ms-wrapper')
53619               .classed('hide', true);
53620
53621           // inject div to support streetside viewer (pannellum) and attribution line
53622           wrapEnter
53623               .append('div')
53624               .attr('id', 'viewer-streetside')
53625               .append('div')
53626               .attr('class', 'photo-attribution fillD');
53627
53628           var controlsEnter = wrapEnter
53629               .append('div')
53630               .attr('class', 'photo-controls-wrap')
53631               .append('div')
53632               .attr('class', 'photo-controls');
53633
53634           controlsEnter
53635               .append('button')
53636               .on('click.back', step(-1))
53637               .text('◄');
53638
53639           controlsEnter
53640               .append('button')
53641               .on('click.forward', step(1))
53642               .text('►');
53643
53644
53645           // create working canvas for stitching together images
53646           wrap = wrap
53647               .merge(wrapEnter)
53648               .call(setupCanvas, true);
53649
53650           // load streetside pannellum viewer css
53651           select('head').selectAll('#streetside-viewercss')
53652               .data([0])
53653               .enter()
53654               .append('link')
53655               .attr('id', 'streetside-viewercss')
53656               .attr('rel', 'stylesheet')
53657               .attr('href', context.asset(pannellumViewerCSS));
53658
53659           // load streetside pannellum viewer js
53660           select('head').selectAll('#streetside-viewerjs')
53661               .data([0])
53662               .enter()
53663               .append('script')
53664               .attr('id', 'streetside-viewerjs')
53665               .attr('src', context.asset(pannellumViewerJS));
53666
53667
53668           // Register viewer resize handler
53669           context.ui().photoviewer.on('resize', function() {
53670               if (_pannellumViewer) {
53671                   _pannellumViewer.resize();
53672               }
53673           });
53674
53675
53676           function step(stepBy) {
53677               return function() {
53678                   var viewer = select('#photoviewer');
53679                   var selected = viewer.empty() ? undefined : viewer.datum();
53680                   if (!selected) return;
53681
53682                   var nextID = (stepBy === 1 ? selected.ne : selected.pr);
53683                   var yaw = _pannellumViewer.getYaw();
53684                   var ca = selected.ca + yaw;
53685                   var origin = selected.loc;
53686
53687                   // construct a search trapezoid pointing out from current bubble
53688                   var meters = 35;
53689                   var p1 = [
53690                       origin[0] + geoMetersToLon(meters / 5, origin[1]),
53691                       origin[1]
53692                   ];
53693                   var p2 = [
53694                       origin[0] + geoMetersToLon(meters / 2, origin[1]),
53695                       origin[1] + geoMetersToLat(meters)
53696                   ];
53697                   var p3 = [
53698                       origin[0] - geoMetersToLon(meters / 2, origin[1]),
53699                       origin[1] + geoMetersToLat(meters)
53700                   ];
53701                   var p4 = [
53702                       origin[0] - geoMetersToLon(meters / 5, origin[1]),
53703                       origin[1]
53704                   ];
53705
53706                   var poly = [p1, p2, p3, p4, p1];
53707
53708                   // rotate it to face forward/backward
53709                   var angle = (stepBy === 1 ? ca : ca + 180) * (Math.PI / 180);
53710                   poly = geoRotate(poly, -angle, origin);
53711
53712                   var extent = poly.reduce(function(extent, point) {
53713                       return extent.extend(geoExtent(point));
53714                   }, geoExtent());
53715
53716                   // find nearest other bubble in the search polygon
53717                   var minDist = Infinity;
53718                   _ssCache.bubbles.rtree.search(extent.bbox())
53719                       .forEach(function(d) {
53720                           if (d.data.key === selected.key) return;
53721                           if (!geoPointInPolygon(d.data.loc, poly)) return;
53722
53723                           var dist = geoVecLength(d.data.loc, selected.loc);
53724                           var theta = selected.ca - d.data.ca;
53725                           var minTheta = Math.min(Math.abs(theta), 360 - Math.abs(theta));
53726                           if (minTheta > 20) {
53727                               dist += 5;  // penalize distance if camera angles don't match
53728                           }
53729
53730                           if (dist < minDist) {
53731                               nextID = d.data.key;
53732                               minDist = dist;
53733                           }
53734                       });
53735
53736                   var nextBubble = nextID && _ssCache.bubbles.points[nextID];
53737                   if (!nextBubble) return;
53738
53739                   context.map().centerEase(nextBubble.loc);
53740
53741                   that.selectImage(nextBubble)
53742                       .then(function(r) {
53743                           if (r.status === 'ok') {
53744                               _sceneOptions.yaw = yaw;
53745                               that.showViewer();
53746                           }
53747                       });
53748               };
53749           }
53750       },
53751
53752       /**
53753        * showViewer()
53754        */
53755       showViewer: function (yaw) {
53756           if (!_sceneOptions) return;
53757
53758           if (yaw !== undefined) {
53759               _sceneOptions.yaw = yaw;
53760           }
53761
53762           if (!_pannellumViewer) {
53763               this.initViewer();
53764           } else {
53765               // make a new scene
53766               var sceneID = ++_currScene + '';
53767               _pannellumViewer
53768                   .addScene(sceneID, _sceneOptions)
53769                   .loadScene(sceneID);
53770
53771               // remove previous scene
53772               if (_currScene > 2) {
53773                   sceneID = (_currScene - 1) + '';
53774                   _pannellumViewer
53775                       .removeScene(sceneID);
53776               }
53777           }
53778
53779           var wrap = select('#photoviewer')
53780               .classed('hide', false);
53781
53782           var isHidden = wrap.selectAll('.photo-wrapper.ms-wrapper.hide').size();
53783
53784           if (isHidden) {
53785               wrap
53786                   .selectAll('.photo-wrapper:not(.ms-wrapper)')
53787                   .classed('hide', true);
53788
53789               wrap
53790                   .selectAll('.photo-wrapper.ms-wrapper')
53791                   .classed('hide', false);
53792           }
53793
53794           return this;
53795       },
53796
53797       /**
53798        * hideViewer()
53799        */
53800       hideViewer: function () {
53801           var viewer = select('#photoviewer');
53802           if (!viewer.empty()) viewer.datum(null);
53803
53804           viewer
53805               .classed('hide', true)
53806               .selectAll('.photo-wrapper')
53807               .classed('hide', true);
53808
53809           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
53810               .classed('currentView', false);
53811
53812           return this.setStyles(null, true);
53813       },
53814
53815       /**
53816        * selectImage().
53817        */
53818       selectImage: function (d) {
53819           var response = q.defer();
53820           var that = this;
53821
53822           var viewer = select('#photoviewer');
53823           if (!viewer.empty()) viewer.datum(d);
53824
53825           this.setStyles(null, true);
53826
53827           var wrap = select('#photoviewer .ms-wrapper');
53828           var attribution = wrap.selectAll('.photo-attribution').html('');
53829
53830           wrap.selectAll('.pnlm-load-box')   // display "loading.."
53831               .style('display', 'block');
53832
53833           if (!d) {
53834               response.resolve({status: 'ok'});
53835               return response.promise;
53836           }
53837
53838           var line1 = attribution
53839               .append('div')
53840               .attr('class', 'attribution-row');
53841
53842           // Add hires checkbox
53843           var label = line1
53844               .append('label')
53845               .attr('class', 'streetside-hires');
53846
53847           label
53848               .append('input')
53849               .attr('type', 'checkbox')
53850               .attr('id', 'streetside-hires-input')
53851               .property('checked', _hires)
53852               .on('click', function() {
53853                   event.stopPropagation();
53854
53855                   _hires = !_hires;
53856                   _resolution = _hires ? 1024 : 512;
53857                   wrap.call(setupCanvas, true);
53858
53859                   var viewstate = {
53860                       yaw: _pannellumViewer.getYaw(),
53861                       pitch: _pannellumViewer.getPitch(),
53862                       hfov: _pannellumViewer.getHfov()
53863                   };
53864
53865                   that.selectImage(d)
53866                       .then(function(r) {
53867                           if (r.status === 'ok') {
53868                               _sceneOptions = assignIn(_sceneOptions, viewstate);
53869                               that.showViewer();
53870                           }
53871                       });
53872               });
53873
53874           label
53875               .append('span')
53876               .text(t('streetside.hires'));
53877
53878
53879           var captureInfo = line1
53880               .append('div')
53881               .attr('class', 'attribution-capture-info');
53882
53883           // Add capture date
53884           if (d.captured_by) {
53885               var yyyy = (new Date()).getFullYear();
53886
53887               captureInfo
53888                   .append('a')
53889                   .attr('class', 'captured_by')
53890                   .attr('target', '_blank')
53891                   .attr('href', 'https://www.microsoft.com/en-us/maps/streetside')
53892                   .text('©' + yyyy + ' Microsoft');
53893
53894               captureInfo
53895                   .append('span')
53896                   .text('|');
53897           }
53898
53899           if (d.captured_at) {
53900               captureInfo
53901                   .append('span')
53902                   .attr('class', 'captured_at')
53903                   .text(localeTimestamp(d.captured_at));
53904           }
53905
53906           // Add image links
53907           var line2 = attribution
53908               .append('div')
53909               .attr('class', 'attribution-row');
53910
53911           line2
53912               .append('a')
53913               .attr('class', 'image-view-link')
53914               .attr('target', '_blank')
53915               .attr('href', 'https://www.bing.com/maps?cp=' + d.loc[1] + '~' + d.loc[0] +
53916                   '&lvl=17&dir=' + d.ca + '&style=x&v=2&sV=1')
53917               .text(t('streetside.view_on_bing'));
53918
53919           line2
53920               .append('a')
53921               .attr('class', 'image-report-link')
53922               .attr('target', '_blank')
53923               .attr('href', 'https://www.bing.com/maps/privacyreport/streetsideprivacyreport?bubbleid=' + encodeURIComponent(d.key) +
53924                   '&focus=photo&lat=' + d.loc[1] + '&lng=' + d.loc[0] + '&z=17')
53925               .text(t('streetside.report'));
53926
53927
53928           var bubbleIdQuadKey = d.key.toString(4);
53929           var paddingNeeded = 16 - bubbleIdQuadKey.length;
53930           for (var i = 0; i < paddingNeeded; i++) {
53931               bubbleIdQuadKey = '0' + bubbleIdQuadKey;
53932           }
53933           var imgUrlPrefix = streetsideImagesApi + 'hs' + bubbleIdQuadKey;
53934           var imgUrlSuffix = '.jpg?g=6338&n=z';
53935
53936           // Cubemap face code order matters here: front=01, right=02, back=03, left=10, up=11, down=12
53937           var faceKeys = ['01','02','03','10','11','12'];
53938
53939           // Map images to cube faces
53940           var quadKeys = getQuadKeys();
53941           var faces = faceKeys.map(function(faceKey) {
53942               return quadKeys.map(function(quadKey) {
53943                   var xy = qkToXY(quadKey);
53944                   return {
53945                       face: faceKey,
53946                       url: imgUrlPrefix + faceKey + quadKey + imgUrlSuffix,
53947                       x: xy[0],
53948                       y: xy[1]
53949                   };
53950               });
53951           });
53952
53953           processFaces(faces).then(function() {
53954               _sceneOptions = {
53955                   showFullscreenCtrl: false,
53956                   autoLoad: true,
53957                   compass: true,
53958                   northOffset: d.ca,
53959                   yaw: 0,
53960                   minHfov: minHfov,
53961                   maxHfov: maxHfov,
53962                   hfov: defaultHfov,
53963                   type: 'cubemap',
53964                   cubeMap: [
53965                       _dataUrlArray[0],
53966                       _dataUrlArray[1],
53967                       _dataUrlArray[2],
53968                       _dataUrlArray[3],
53969                       _dataUrlArray[4],
53970                       _dataUrlArray[5]
53971                   ]
53972               };
53973               response.resolve({status: 'ok'});
53974           });
53975
53976           return response.promise;
53977       },
53978
53979
53980       getSequenceKeyForBubble: function(d) {
53981           return d && d.sequenceKey;
53982       },
53983
53984
53985       // Updates the currently highlighted sequence and selected bubble.
53986       // Reset is only necessary when interacting with the viewport because
53987       // this implicitly changes the currently selected bubble/sequence
53988       setStyles: function (hovered, reset) {
53989           if (reset) {  // reset all layers
53990               d3_selectAll('.viewfield-group')
53991                   .classed('highlighted', false)
53992                   .classed('hovered', false)
53993                   .classed('currentView', false);
53994
53995               d3_selectAll('.sequence')
53996                   .classed('highlighted', false)
53997                   .classed('currentView', false);
53998           }
53999
54000           var hoveredBubbleKey = hovered && hovered.key;
54001           var hoveredSequenceKey = this.getSequenceKeyForBubble(hovered);
54002           var hoveredSequence = hoveredSequenceKey && _ssCache.sequences[hoveredSequenceKey];
54003           var hoveredBubbleKeys =  (hoveredSequence && hoveredSequence.bubbles.map(function (d) { return d.key; })) || [];
54004
54005           var viewer = select('#photoviewer');
54006           var selected = viewer.empty() ? undefined : viewer.datum();
54007           var selectedBubbleKey = selected && selected.key;
54008           var selectedSequenceKey = this.getSequenceKeyForBubble(selected);
54009           var selectedSequence = selectedSequenceKey && _ssCache.sequences[selectedSequenceKey];
54010           var selectedBubbleKeys = (selectedSequence && selectedSequence.bubbles.map(function (d) { return d.key; })) || [];
54011
54012           // highlight sibling viewfields on either the selected or the hovered sequences
54013           var highlightedBubbleKeys = union(hoveredBubbleKeys, selectedBubbleKeys);
54014
54015           d3_selectAll('.layer-streetside-images .viewfield-group')
54016               .classed('highlighted', function (d) { return highlightedBubbleKeys.indexOf(d.key) !== -1; })
54017               .classed('hovered', function (d) { return d.key === hoveredBubbleKey; })
54018               .classed('currentView', function (d) { return d.key === selectedBubbleKey; });
54019
54020           d3_selectAll('.layer-streetside-images .sequence')
54021               .classed('highlighted', function (d) { return d.properties.key === hoveredSequenceKey; })
54022               .classed('currentView', function (d) { return d.properties.key === selectedSequenceKey; });
54023
54024           // update viewfields if needed
54025           d3_selectAll('.viewfield-group .viewfield')
54026               .attr('d', viewfieldPath);
54027
54028           function viewfieldPath() {
54029               var d = this.parentNode.__data__;
54030               if (d.pano && d.key !== selectedBubbleKey) {
54031                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
54032               } else {
54033                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
54034               }
54035           }
54036
54037           return this;
54038       },
54039
54040       /**
54041        * cache().
54042        */
54043       cache: function () {
54044           return _ssCache;
54045       }
54046   };
54047
54048   var apibase$4 = 'https://taginfo.openstreetmap.org/api/4/';
54049   var _inflight$1 = {};
54050   var _popularKeys = {};
54051   var _taginfoCache = {};
54052
54053   var tag_sorts = {
54054       point: 'count_nodes',
54055       vertex: 'count_nodes',
54056       area: 'count_ways',
54057       line: 'count_ways'
54058   };
54059   var tag_sort_members = {
54060       point: 'count_node_members',
54061       vertex: 'count_node_members',
54062       area: 'count_way_members',
54063       line: 'count_way_members',
54064       relation: 'count_relation_members'
54065   };
54066   var tag_filters = {
54067       point: 'nodes',
54068       vertex: 'nodes',
54069       area: 'ways',
54070       line: 'ways'
54071   };
54072   var tag_members_fractions = {
54073       point: 'count_node_members_fraction',
54074       vertex: 'count_node_members_fraction',
54075       area: 'count_way_members_fraction',
54076       line: 'count_way_members_fraction',
54077       relation: 'count_relation_members_fraction'
54078   };
54079
54080
54081   function sets(params, n, o) {
54082       if (params.geometry && o[params.geometry]) {
54083           params[n] = o[params.geometry];
54084       }
54085       return params;
54086   }
54087
54088
54089   function setFilter(params) {
54090       return sets(params, 'filter', tag_filters);
54091   }
54092
54093
54094   function setSort(params) {
54095       return sets(params, 'sortname', tag_sorts);
54096   }
54097
54098
54099   function setSortMembers(params) {
54100       return sets(params, 'sortname', tag_sort_members);
54101   }
54102
54103
54104   function clean(params) {
54105       return omit(params, ['geometry', 'debounce']);
54106   }
54107
54108
54109   function filterKeys(type) {
54110       var count_type = type ? 'count_' + type : 'count_all';
54111       return function(d) {
54112           return parseFloat(d[count_type]) > 2500 || d.in_wiki;
54113       };
54114   }
54115
54116
54117   function filterMultikeys(prefix) {
54118       return function(d) {
54119           // d.key begins with prefix, and d.key contains no additional ':'s
54120           var re = new RegExp('^' + prefix + '(.*)$');
54121           var matches = d.key.match(re) || [];
54122           return (matches.length === 2 && matches[1].indexOf(':') === -1);
54123       };
54124   }
54125
54126
54127   function filterValues(allowUpperCase) {
54128       return function(d) {
54129           if (d.value.match(/[;,]/) !== null) return false;  // exclude some punctuation
54130           if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false;  // exclude uppercase letters
54131           return parseFloat(d.fraction) > 0.0;
54132       };
54133   }
54134
54135
54136   function filterRoles(geometry) {
54137       return function(d) {
54138           if (d.role === '') return false; // exclude empty role
54139           if (d.role.match(/[A-Z*;,]/) !== null) return false;  // exclude uppercase letters and some punctuation
54140           return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
54141       };
54142   }
54143
54144
54145   function valKey(d) {
54146       return {
54147           value: d.key,
54148           title: d.key
54149       };
54150   }
54151
54152
54153   function valKeyDescription(d) {
54154       return {
54155           value: d.value,
54156           title: d.description || d.value
54157       };
54158   }
54159
54160
54161   function roleKey(d) {
54162       return {
54163           value: d.role,
54164           title: d.role
54165       };
54166   }
54167
54168
54169   // sort keys with ':' lower than keys without ':'
54170   function sortKeys(a, b) {
54171       return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
54172           : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1
54173           : 0;
54174   }
54175
54176
54177   var debouncedRequest$1 = debounce(request$2, 300, { leading: false });
54178
54179   function request$2(url, params, exactMatch, callback, loaded) {
54180       if (_inflight$1[url]) return;
54181
54182       if (checkCache(url, params, exactMatch, callback)) return;
54183
54184       _inflight$1[url] = d3_json(url, function (err, data) {
54185           delete _inflight$1[url];
54186           loaded(err, data);
54187       });
54188   }
54189
54190
54191   function checkCache(url, params, exactMatch, callback) {
54192       var rp = params.rp || 25;
54193       var testQuery = params.query || '';
54194       var testUrl = url;
54195
54196       do {
54197           var hit = _taginfoCache[testUrl];
54198
54199           // exact match, or shorter match yielding fewer than max results (rp)
54200           if (hit && (url === testUrl || hit.length < rp)) {
54201               callback(null, hit);
54202               return true;
54203           }
54204
54205           // don't try to shorten the query
54206           if (exactMatch || !testQuery.length) return false;
54207
54208           // do shorten the query to see if we already have a cached result
54209           // that has returned fewer than max results (rp)
54210           testQuery = testQuery.slice(0, -1);
54211           testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
54212       } while (testQuery.length >= 0);
54213
54214       return false;
54215   }
54216
54217
54218   var serviceTaginfo = {
54219
54220       init: function() {
54221           _inflight$1 = {};
54222           _taginfoCache = {};
54223           _popularKeys = {
54224               postal_code: true   // #5377
54225           };
54226
54227           // Fetch popular keys.  We'll exclude these from `values`
54228           // lookups because they stress taginfo, and they aren't likely
54229           // to yield meaningful autocomplete results.. see #3955
54230           var params = {
54231               rp: 100,
54232               sortname: 'values_all',
54233               sortorder: 'desc',
54234               page: 1,
54235               debounce: false,
54236               lang: currentLocale
54237           };
54238           this.keys(params, function(err, data) {
54239               if (err) return;
54240               data.forEach(function(d) {
54241                   if (d.value === 'opening_hours') return;  // exception
54242                   _popularKeys[d.value] = true;
54243               });
54244           });
54245       },
54246
54247
54248       reset: function() {
54249           forEach(_inflight$1, function(req) { req.abort(); });
54250           _inflight$1 = {};
54251       },
54252
54253
54254       keys: function(params, callback) {
54255           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
54256           params = clean(setSort(params));
54257           params = assignIn({
54258               rp: 10,
54259               sortname: 'count_all',
54260               sortorder: 'desc',
54261               page: 1,
54262               lang: currentLocale
54263           }, params);
54264
54265           var url = apibase$4 + 'keys/all?' + utilQsString(params);
54266           doRequest(url, params, false, callback, function(err, d) {
54267               if (err) {
54268                   callback(err);
54269               } else {
54270                   var f = filterKeys(params.filter);
54271                   var result = d.data.filter(f).sort(sortKeys).map(valKey);
54272                   _taginfoCache[url] = result;
54273                   callback(null, result);
54274               }
54275           });
54276       },
54277
54278
54279       multikeys: function(params, callback) {
54280           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
54281           params = clean(setSort(params));
54282           params = assignIn({
54283               rp: 25,
54284               sortname: 'count_all',
54285               sortorder: 'desc',
54286               page: 1,
54287               lang: currentLocale
54288           }, params);
54289
54290           var prefix = params.query;
54291           var url = apibase$4 + 'keys/all?' + utilQsString(params);
54292           doRequest(url, params, true, callback, function(err, d) {
54293               if (err) {
54294                   callback(err);
54295               } else {
54296                   var f = filterMultikeys(prefix);
54297                   var result = d.data.filter(f).map(valKey);
54298                   _taginfoCache[url] = result;
54299                   callback(null, result);
54300               }
54301           });
54302       },
54303
54304
54305       values: function(params, callback) {
54306           // Exclude popular keys from values lookups.. see #3955
54307           var key = params.key;
54308           if (key && _popularKeys[key]) {
54309               callback(null, []);
54310               return;
54311           }
54312
54313           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
54314           params = clean(setSort(setFilter(params)));
54315           params = assignIn({
54316               rp: 25,
54317               sortname: 'count_all',
54318               sortorder: 'desc',
54319               page: 1,
54320               lang: currentLocale
54321           }, params);
54322
54323           var url = apibase$4 + 'key/values?' + utilQsString(params);
54324           doRequest(url, params, false, callback, function(err, d) {
54325               if (err) {
54326                   callback(err);
54327               } else {
54328                   // In most cases we prefer taginfo value results with lowercase letters.
54329                   // A few OSM keys expect values to contain uppercase values (see #3377).
54330                   // This is not an exhaustive list (e.g. `name` also has uppercase values)
54331                   // but these are the fields where taginfo value lookup is most useful.
54332                   var re = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times/;
54333                   var allowUpperCase = (params.key.match(re) !== null);
54334                   var f = filterValues(allowUpperCase);
54335
54336                   var result = d.data.filter(f).map(valKeyDescription);
54337                   _taginfoCache[url] = result;
54338                   callback(null, result);
54339               }
54340           });
54341       },
54342
54343
54344       roles: function(params, callback) {
54345           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
54346           var geometry = params.geometry;
54347           params = clean(setSortMembers(params));
54348           params = assignIn({
54349               rp: 25,
54350               sortname: 'count_all_members',
54351               sortorder: 'desc',
54352               page: 1,
54353               lang: currentLocale
54354           }, params);
54355
54356           var url = apibase$4 + 'relation/roles?' + utilQsString(params);
54357           doRequest(url, params, true, callback, function(err, d) {
54358               if (err) {
54359                   callback(err);
54360               } else {
54361                   var f = filterRoles(geometry);
54362                   var result = d.data.filter(f).map(roleKey);
54363                   _taginfoCache[url] = result;
54364                   callback(null, result);
54365               }
54366           });
54367       },
54368
54369
54370       docs: function(params, callback) {
54371           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
54372           params = clean(setSort(params));
54373
54374           var path = 'key/wiki_pages?';
54375           if (params.value) {
54376               path = 'tag/wiki_pages?';
54377           } else if (params.rtype) {
54378               path = 'relation/wiki_pages?';
54379           }
54380
54381           var url = apibase$4 + path + utilQsString(params);
54382           doRequest(url, params, true, callback, function(err, d) {
54383               if (err) {
54384                   callback(err);
54385               } else {
54386                   _taginfoCache[url] = d.data;
54387                   callback(null, d.data);
54388               }
54389           });
54390       },
54391
54392
54393       apibase: function(_) {
54394           if (!arguments.length) return apibase$4;
54395           apibase$4 = _;
54396           return this;
54397       }
54398
54399   };
54400
54401   var helpers = createCommonjsModule(function (module, exports) {
54402   Object.defineProperty(exports, "__esModule", { value: true });
54403   /**
54404    * @module helpers
54405    */
54406   /**
54407    * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
54408    *
54409    * @memberof helpers
54410    * @type {number}
54411    */
54412   exports.earthRadius = 6371008.8;
54413   /**
54414    * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
54415    *
54416    * @memberof helpers
54417    * @type {Object}
54418    */
54419   exports.factors = {
54420       centimeters: exports.earthRadius * 100,
54421       centimetres: exports.earthRadius * 100,
54422       degrees: exports.earthRadius / 111325,
54423       feet: exports.earthRadius * 3.28084,
54424       inches: exports.earthRadius * 39.370,
54425       kilometers: exports.earthRadius / 1000,
54426       kilometres: exports.earthRadius / 1000,
54427       meters: exports.earthRadius,
54428       metres: exports.earthRadius,
54429       miles: exports.earthRadius / 1609.344,
54430       millimeters: exports.earthRadius * 1000,
54431       millimetres: exports.earthRadius * 1000,
54432       nauticalmiles: exports.earthRadius / 1852,
54433       radians: 1,
54434       yards: exports.earthRadius / 1.0936,
54435   };
54436   /**
54437    * Units of measurement factors based on 1 meter.
54438    *
54439    * @memberof helpers
54440    * @type {Object}
54441    */
54442   exports.unitsFactors = {
54443       centimeters: 100,
54444       centimetres: 100,
54445       degrees: 1 / 111325,
54446       feet: 3.28084,
54447       inches: 39.370,
54448       kilometers: 1 / 1000,
54449       kilometres: 1 / 1000,
54450       meters: 1,
54451       metres: 1,
54452       miles: 1 / 1609.344,
54453       millimeters: 1000,
54454       millimetres: 1000,
54455       nauticalmiles: 1 / 1852,
54456       radians: 1 / exports.earthRadius,
54457       yards: 1 / 1.0936,
54458   };
54459   /**
54460    * Area of measurement factors based on 1 square meter.
54461    *
54462    * @memberof helpers
54463    * @type {Object}
54464    */
54465   exports.areaFactors = {
54466       acres: 0.000247105,
54467       centimeters: 10000,
54468       centimetres: 10000,
54469       feet: 10.763910417,
54470       inches: 1550.003100006,
54471       kilometers: 0.000001,
54472       kilometres: 0.000001,
54473       meters: 1,
54474       metres: 1,
54475       miles: 3.86e-7,
54476       millimeters: 1000000,
54477       millimetres: 1000000,
54478       yards: 1.195990046,
54479   };
54480   /**
54481    * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
54482    *
54483    * @name feature
54484    * @param {Geometry} geometry input geometry
54485    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54486    * @param {Object} [options={}] Optional Parameters
54487    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54488    * @param {string|number} [options.id] Identifier associated with the Feature
54489    * @returns {Feature} a GeoJSON Feature
54490    * @example
54491    * var geometry = {
54492    *   "type": "Point",
54493    *   "coordinates": [110, 50]
54494    * };
54495    *
54496    * var feature = turf.feature(geometry);
54497    *
54498    * //=feature
54499    */
54500   function feature(geom, properties, options) {
54501       if (options === void 0) { options = {}; }
54502       var feat = { type: "Feature" };
54503       if (options.id === 0 || options.id) {
54504           feat.id = options.id;
54505       }
54506       if (options.bbox) {
54507           feat.bbox = options.bbox;
54508       }
54509       feat.properties = properties || {};
54510       feat.geometry = geom;
54511       return feat;
54512   }
54513   exports.feature = feature;
54514   /**
54515    * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
54516    * For GeometryCollection type use `helpers.geometryCollection`
54517    *
54518    * @name geometry
54519    * @param {string} type Geometry Type
54520    * @param {Array<any>} coordinates Coordinates
54521    * @param {Object} [options={}] Optional Parameters
54522    * @returns {Geometry} a GeoJSON Geometry
54523    * @example
54524    * var type = "Point";
54525    * var coordinates = [110, 50];
54526    * var geometry = turf.geometry(type, coordinates);
54527    * // => geometry
54528    */
54529   function geometry(type, coordinates, options) {
54530       if (options === void 0) { options = {}; }
54531       switch (type) {
54532           case "Point": return point(coordinates).geometry;
54533           case "LineString": return lineString(coordinates).geometry;
54534           case "Polygon": return polygon(coordinates).geometry;
54535           case "MultiPoint": return multiPoint(coordinates).geometry;
54536           case "MultiLineString": return multiLineString(coordinates).geometry;
54537           case "MultiPolygon": return multiPolygon(coordinates).geometry;
54538           default: throw new Error(type + " is invalid");
54539       }
54540   }
54541   exports.geometry = geometry;
54542   /**
54543    * Creates a {@link Point} {@link Feature} from a Position.
54544    *
54545    * @name point
54546    * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
54547    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54548    * @param {Object} [options={}] Optional Parameters
54549    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54550    * @param {string|number} [options.id] Identifier associated with the Feature
54551    * @returns {Feature<Point>} a Point feature
54552    * @example
54553    * var point = turf.point([-75.343, 39.984]);
54554    *
54555    * //=point
54556    */
54557   function point(coordinates, properties, options) {
54558       if (options === void 0) { options = {}; }
54559       var geom = {
54560           type: "Point",
54561           coordinates: coordinates,
54562       };
54563       return feature(geom, properties, options);
54564   }
54565   exports.point = point;
54566   /**
54567    * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
54568    *
54569    * @name points
54570    * @param {Array<Array<number>>} coordinates an array of Points
54571    * @param {Object} [properties={}] Translate these properties to each Feature
54572    * @param {Object} [options={}] Optional Parameters
54573    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
54574    * associated with the FeatureCollection
54575    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
54576    * @returns {FeatureCollection<Point>} Point Feature
54577    * @example
54578    * var points = turf.points([
54579    *   [-75, 39],
54580    *   [-80, 45],
54581    *   [-78, 50]
54582    * ]);
54583    *
54584    * //=points
54585    */
54586   function points(coordinates, properties, options) {
54587       if (options === void 0) { options = {}; }
54588       return featureCollection(coordinates.map(function (coords) {
54589           return point(coords, properties);
54590       }), options);
54591   }
54592   exports.points = points;
54593   /**
54594    * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
54595    *
54596    * @name polygon
54597    * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
54598    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54599    * @param {Object} [options={}] Optional Parameters
54600    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54601    * @param {string|number} [options.id] Identifier associated with the Feature
54602    * @returns {Feature<Polygon>} Polygon Feature
54603    * @example
54604    * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
54605    *
54606    * //=polygon
54607    */
54608   function polygon(coordinates, properties, options) {
54609       if (options === void 0) { options = {}; }
54610       for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {
54611           var ring = coordinates_1[_i];
54612           if (ring.length < 4) {
54613               throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");
54614           }
54615           for (var j = 0; j < ring[ring.length - 1].length; j++) {
54616               // Check if first point of Polygon contains two numbers
54617               if (ring[ring.length - 1][j] !== ring[0][j]) {
54618                   throw new Error("First and last Position are not equivalent.");
54619               }
54620           }
54621       }
54622       var geom = {
54623           type: "Polygon",
54624           coordinates: coordinates,
54625       };
54626       return feature(geom, properties, options);
54627   }
54628   exports.polygon = polygon;
54629   /**
54630    * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
54631    *
54632    * @name polygons
54633    * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
54634    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54635    * @param {Object} [options={}] Optional Parameters
54636    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54637    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
54638    * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
54639    * @example
54640    * var polygons = turf.polygons([
54641    *   [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
54642    *   [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
54643    * ]);
54644    *
54645    * //=polygons
54646    */
54647   function polygons(coordinates, properties, options) {
54648       if (options === void 0) { options = {}; }
54649       return featureCollection(coordinates.map(function (coords) {
54650           return polygon(coords, properties);
54651       }), options);
54652   }
54653   exports.polygons = polygons;
54654   /**
54655    * Creates a {@link LineString} {@link Feature} from an Array of Positions.
54656    *
54657    * @name lineString
54658    * @param {Array<Array<number>>} coordinates an array of Positions
54659    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54660    * @param {Object} [options={}] Optional Parameters
54661    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54662    * @param {string|number} [options.id] Identifier associated with the Feature
54663    * @returns {Feature<LineString>} LineString Feature
54664    * @example
54665    * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
54666    * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
54667    *
54668    * //=linestring1
54669    * //=linestring2
54670    */
54671   function lineString(coordinates, properties, options) {
54672       if (options === void 0) { options = {}; }
54673       if (coordinates.length < 2) {
54674           throw new Error("coordinates must be an array of two or more positions");
54675       }
54676       var geom = {
54677           type: "LineString",
54678           coordinates: coordinates,
54679       };
54680       return feature(geom, properties, options);
54681   }
54682   exports.lineString = lineString;
54683   /**
54684    * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
54685    *
54686    * @name lineStrings
54687    * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
54688    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54689    * @param {Object} [options={}] Optional Parameters
54690    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
54691    * associated with the FeatureCollection
54692    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
54693    * @returns {FeatureCollection<LineString>} LineString FeatureCollection
54694    * @example
54695    * var linestrings = turf.lineStrings([
54696    *   [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
54697    *   [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
54698    * ]);
54699    *
54700    * //=linestrings
54701    */
54702   function lineStrings(coordinates, properties, options) {
54703       if (options === void 0) { options = {}; }
54704       return featureCollection(coordinates.map(function (coords) {
54705           return lineString(coords, properties);
54706       }), options);
54707   }
54708   exports.lineStrings = lineStrings;
54709   /**
54710    * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
54711    *
54712    * @name featureCollection
54713    * @param {Feature[]} features input features
54714    * @param {Object} [options={}] Optional Parameters
54715    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54716    * @param {string|number} [options.id] Identifier associated with the Feature
54717    * @returns {FeatureCollection} FeatureCollection of Features
54718    * @example
54719    * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
54720    * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
54721    * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
54722    *
54723    * var collection = turf.featureCollection([
54724    *   locationA,
54725    *   locationB,
54726    *   locationC
54727    * ]);
54728    *
54729    * //=collection
54730    */
54731   function featureCollection(features, options) {
54732       if (options === void 0) { options = {}; }
54733       var fc = { type: "FeatureCollection" };
54734       if (options.id) {
54735           fc.id = options.id;
54736       }
54737       if (options.bbox) {
54738           fc.bbox = options.bbox;
54739       }
54740       fc.features = features;
54741       return fc;
54742   }
54743   exports.featureCollection = featureCollection;
54744   /**
54745    * Creates a {@link Feature<MultiLineString>} based on a
54746    * coordinate array. Properties can be added optionally.
54747    *
54748    * @name multiLineString
54749    * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
54750    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54751    * @param {Object} [options={}] Optional Parameters
54752    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54753    * @param {string|number} [options.id] Identifier associated with the Feature
54754    * @returns {Feature<MultiLineString>} a MultiLineString feature
54755    * @throws {Error} if no coordinates are passed
54756    * @example
54757    * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
54758    *
54759    * //=multiLine
54760    */
54761   function multiLineString(coordinates, properties, options) {
54762       if (options === void 0) { options = {}; }
54763       var geom = {
54764           type: "MultiLineString",
54765           coordinates: coordinates,
54766       };
54767       return feature(geom, properties, options);
54768   }
54769   exports.multiLineString = multiLineString;
54770   /**
54771    * Creates a {@link Feature<MultiPoint>} based on a
54772    * coordinate array. Properties can be added optionally.
54773    *
54774    * @name multiPoint
54775    * @param {Array<Array<number>>} coordinates an array of Positions
54776    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54777    * @param {Object} [options={}] Optional Parameters
54778    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54779    * @param {string|number} [options.id] Identifier associated with the Feature
54780    * @returns {Feature<MultiPoint>} a MultiPoint feature
54781    * @throws {Error} if no coordinates are passed
54782    * @example
54783    * var multiPt = turf.multiPoint([[0,0],[10,10]]);
54784    *
54785    * //=multiPt
54786    */
54787   function multiPoint(coordinates, properties, options) {
54788       if (options === void 0) { options = {}; }
54789       var geom = {
54790           type: "MultiPoint",
54791           coordinates: coordinates,
54792       };
54793       return feature(geom, properties, options);
54794   }
54795   exports.multiPoint = multiPoint;
54796   /**
54797    * Creates a {@link Feature<MultiPolygon>} based on a
54798    * coordinate array. Properties can be added optionally.
54799    *
54800    * @name multiPolygon
54801    * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
54802    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54803    * @param {Object} [options={}] Optional Parameters
54804    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54805    * @param {string|number} [options.id] Identifier associated with the Feature
54806    * @returns {Feature<MultiPolygon>} a multipolygon feature
54807    * @throws {Error} if no coordinates are passed
54808    * @example
54809    * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
54810    *
54811    * //=multiPoly
54812    *
54813    */
54814   function multiPolygon(coordinates, properties, options) {
54815       if (options === void 0) { options = {}; }
54816       var geom = {
54817           type: "MultiPolygon",
54818           coordinates: coordinates,
54819       };
54820       return feature(geom, properties, options);
54821   }
54822   exports.multiPolygon = multiPolygon;
54823   /**
54824    * Creates a {@link Feature<GeometryCollection>} based on a
54825    * coordinate array. Properties can be added optionally.
54826    *
54827    * @name geometryCollection
54828    * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
54829    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54830    * @param {Object} [options={}] Optional Parameters
54831    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54832    * @param {string|number} [options.id] Identifier associated with the Feature
54833    * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
54834    * @example
54835    * var pt = turf.geometry("Point", [100, 0]);
54836    * var line = turf.geometry("LineString", [[101, 0], [102, 1]]);
54837    * var collection = turf.geometryCollection([pt, line]);
54838    *
54839    * // => collection
54840    */
54841   function geometryCollection(geometries, properties, options) {
54842       if (options === void 0) { options = {}; }
54843       var geom = {
54844           type: "GeometryCollection",
54845           geometries: geometries,
54846       };
54847       return feature(geom, properties, options);
54848   }
54849   exports.geometryCollection = geometryCollection;
54850   /**
54851    * Round number to precision
54852    *
54853    * @param {number} num Number
54854    * @param {number} [precision=0] Precision
54855    * @returns {number} rounded number
54856    * @example
54857    * turf.round(120.4321)
54858    * //=120
54859    *
54860    * turf.round(120.4321, 2)
54861    * //=120.43
54862    */
54863   function round(num, precision) {
54864       if (precision === void 0) { precision = 0; }
54865       if (precision && !(precision >= 0)) {
54866           throw new Error("precision must be a positive number");
54867       }
54868       var multiplier = Math.pow(10, precision || 0);
54869       return Math.round(num * multiplier) / multiplier;
54870   }
54871   exports.round = round;
54872   /**
54873    * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
54874    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
54875    *
54876    * @name radiansToLength
54877    * @param {number} radians in radians across the sphere
54878    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
54879    * meters, kilometres, kilometers.
54880    * @returns {number} distance
54881    */
54882   function radiansToLength(radians, units) {
54883       if (units === void 0) { units = "kilometers"; }
54884       var factor = exports.factors[units];
54885       if (!factor) {
54886           throw new Error(units + " units is invalid");
54887       }
54888       return radians * factor;
54889   }
54890   exports.radiansToLength = radiansToLength;
54891   /**
54892    * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
54893    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
54894    *
54895    * @name lengthToRadians
54896    * @param {number} distance in real units
54897    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
54898    * meters, kilometres, kilometers.
54899    * @returns {number} radians
54900    */
54901   function lengthToRadians(distance, units) {
54902       if (units === void 0) { units = "kilometers"; }
54903       var factor = exports.factors[units];
54904       if (!factor) {
54905           throw new Error(units + " units is invalid");
54906       }
54907       return distance / factor;
54908   }
54909   exports.lengthToRadians = lengthToRadians;
54910   /**
54911    * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
54912    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
54913    *
54914    * @name lengthToDegrees
54915    * @param {number} distance in real units
54916    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
54917    * meters, kilometres, kilometers.
54918    * @returns {number} degrees
54919    */
54920   function lengthToDegrees(distance, units) {
54921       return radiansToDegrees(lengthToRadians(distance, units));
54922   }
54923   exports.lengthToDegrees = lengthToDegrees;
54924   /**
54925    * Converts any bearing angle from the north line direction (positive clockwise)
54926    * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
54927    *
54928    * @name bearingToAzimuth
54929    * @param {number} bearing angle, between -180 and +180 degrees
54930    * @returns {number} angle between 0 and 360 degrees
54931    */
54932   function bearingToAzimuth(bearing) {
54933       var angle = bearing % 360;
54934       if (angle < 0) {
54935           angle += 360;
54936       }
54937       return angle;
54938   }
54939   exports.bearingToAzimuth = bearingToAzimuth;
54940   /**
54941    * Converts an angle in radians to degrees
54942    *
54943    * @name radiansToDegrees
54944    * @param {number} radians angle in radians
54945    * @returns {number} degrees between 0 and 360 degrees
54946    */
54947   function radiansToDegrees(radians) {
54948       var degrees = radians % (2 * Math.PI);
54949       return degrees * 180 / Math.PI;
54950   }
54951   exports.radiansToDegrees = radiansToDegrees;
54952   /**
54953    * Converts an angle in degrees to radians
54954    *
54955    * @name degreesToRadians
54956    * @param {number} degrees angle between 0 and 360 degrees
54957    * @returns {number} angle in radians
54958    */
54959   function degreesToRadians(degrees) {
54960       var radians = degrees % 360;
54961       return radians * Math.PI / 180;
54962   }
54963   exports.degreesToRadians = degreesToRadians;
54964   /**
54965    * Converts a length to the requested unit.
54966    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
54967    *
54968    * @param {number} length to be converted
54969    * @param {Units} [originalUnit="kilometers"] of the length
54970    * @param {Units} [finalUnit="kilometers"] returned unit
54971    * @returns {number} the converted length
54972    */
54973   function convertLength(length, originalUnit, finalUnit) {
54974       if (originalUnit === void 0) { originalUnit = "kilometers"; }
54975       if (finalUnit === void 0) { finalUnit = "kilometers"; }
54976       if (!(length >= 0)) {
54977           throw new Error("length must be a positive number");
54978       }
54979       return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);
54980   }
54981   exports.convertLength = convertLength;
54982   /**
54983    * Converts a area to the requested unit.
54984    * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
54985    * @param {number} area to be converted
54986    * @param {Units} [originalUnit="meters"] of the distance
54987    * @param {Units} [finalUnit="kilometers"] returned unit
54988    * @returns {number} the converted distance
54989    */
54990   function convertArea(area, originalUnit, finalUnit) {
54991       if (originalUnit === void 0) { originalUnit = "meters"; }
54992       if (finalUnit === void 0) { finalUnit = "kilometers"; }
54993       if (!(area >= 0)) {
54994           throw new Error("area must be a positive number");
54995       }
54996       var startFactor = exports.areaFactors[originalUnit];
54997       if (!startFactor) {
54998           throw new Error("invalid original units");
54999       }
55000       var finalFactor = exports.areaFactors[finalUnit];
55001       if (!finalFactor) {
55002           throw new Error("invalid final units");
55003       }
55004       return (area / startFactor) * finalFactor;
55005   }
55006   exports.convertArea = convertArea;
55007   /**
55008    * isNumber
55009    *
55010    * @param {*} num Number to validate
55011    * @returns {boolean} true/false
55012    * @example
55013    * turf.isNumber(123)
55014    * //=true
55015    * turf.isNumber('foo')
55016    * //=false
55017    */
55018   function isNumber(num) {
55019       return !isNaN(num) && num !== null && !Array.isArray(num) && !/^\s*$/.test(num);
55020   }
55021   exports.isNumber = isNumber;
55022   /**
55023    * isObject
55024    *
55025    * @param {*} input variable to validate
55026    * @returns {boolean} true/false
55027    * @example
55028    * turf.isObject({elevation: 10})
55029    * //=true
55030    * turf.isObject('foo')
55031    * //=false
55032    */
55033   function isObject(input) {
55034       return (!!input) && (input.constructor === Object);
55035   }
55036   exports.isObject = isObject;
55037   /**
55038    * Validate BBox
55039    *
55040    * @private
55041    * @param {Array<number>} bbox BBox to validate
55042    * @returns {void}
55043    * @throws Error if BBox is not valid
55044    * @example
55045    * validateBBox([-180, -40, 110, 50])
55046    * //=OK
55047    * validateBBox([-180, -40])
55048    * //=Error
55049    * validateBBox('Foo')
55050    * //=Error
55051    * validateBBox(5)
55052    * //=Error
55053    * validateBBox(null)
55054    * //=Error
55055    * validateBBox(undefined)
55056    * //=Error
55057    */
55058   function validateBBox(bbox) {
55059       if (!bbox) {
55060           throw new Error("bbox is required");
55061       }
55062       if (!Array.isArray(bbox)) {
55063           throw new Error("bbox must be an Array");
55064       }
55065       if (bbox.length !== 4 && bbox.length !== 6) {
55066           throw new Error("bbox must be an Array of 4 or 6 numbers");
55067       }
55068       bbox.forEach(function (num) {
55069           if (!isNumber(num)) {
55070               throw new Error("bbox must only contain numbers");
55071           }
55072       });
55073   }
55074   exports.validateBBox = validateBBox;
55075   /**
55076    * Validate Id
55077    *
55078    * @private
55079    * @param {string|number} id Id to validate
55080    * @returns {void}
55081    * @throws Error if Id is not valid
55082    * @example
55083    * validateId([-180, -40, 110, 50])
55084    * //=Error
55085    * validateId([-180, -40])
55086    * //=Error
55087    * validateId('Foo')
55088    * //=OK
55089    * validateId(5)
55090    * //=OK
55091    * validateId(null)
55092    * //=Error
55093    * validateId(undefined)
55094    * //=Error
55095    */
55096   function validateId(id) {
55097       if (!id) {
55098           throw new Error("id is required");
55099       }
55100       if (["string", "number"].indexOf(typeof id) === -1) {
55101           throw new Error("id must be a number or a string");
55102       }
55103   }
55104   exports.validateId = validateId;
55105   // Deprecated methods
55106   function radians2degrees() {
55107       throw new Error("method has been renamed to `radiansToDegrees`");
55108   }
55109   exports.radians2degrees = radians2degrees;
55110   function degrees2radians() {
55111       throw new Error("method has been renamed to `degreesToRadians`");
55112   }
55113   exports.degrees2radians = degrees2radians;
55114   function distanceToDegrees() {
55115       throw new Error("method has been renamed to `lengthToDegrees`");
55116   }
55117   exports.distanceToDegrees = distanceToDegrees;
55118   function distanceToRadians() {
55119       throw new Error("method has been renamed to `lengthToRadians`");
55120   }
55121   exports.distanceToRadians = distanceToRadians;
55122   function radiansToDistance() {
55123       throw new Error("method has been renamed to `radiansToLength`");
55124   }
55125   exports.radiansToDistance = radiansToDistance;
55126   function bearingToAngle() {
55127       throw new Error("method has been renamed to `bearingToAzimuth`");
55128   }
55129   exports.bearingToAngle = bearingToAngle;
55130   function convertDistance() {
55131       throw new Error("method has been renamed to `convertLength`");
55132   }
55133   exports.convertDistance = convertDistance;
55134   });
55135
55136   unwrapExports(helpers);
55137   var helpers_1 = helpers.earthRadius;
55138   var helpers_2 = helpers.factors;
55139   var helpers_3 = helpers.unitsFactors;
55140   var helpers_4 = helpers.areaFactors;
55141   var helpers_5 = helpers.feature;
55142   var helpers_6 = helpers.geometry;
55143   var helpers_7 = helpers.point;
55144   var helpers_8 = helpers.points;
55145   var helpers_9 = helpers.polygon;
55146   var helpers_10 = helpers.polygons;
55147   var helpers_11 = helpers.lineString;
55148   var helpers_12 = helpers.lineStrings;
55149   var helpers_13 = helpers.featureCollection;
55150   var helpers_14 = helpers.multiLineString;
55151   var helpers_15 = helpers.multiPoint;
55152   var helpers_16 = helpers.multiPolygon;
55153   var helpers_17 = helpers.geometryCollection;
55154   var helpers_18 = helpers.round;
55155   var helpers_19 = helpers.radiansToLength;
55156   var helpers_20 = helpers.lengthToRadians;
55157   var helpers_21 = helpers.lengthToDegrees;
55158   var helpers_22 = helpers.bearingToAzimuth;
55159   var helpers_23 = helpers.radiansToDegrees;
55160   var helpers_24 = helpers.degreesToRadians;
55161   var helpers_25 = helpers.convertLength;
55162   var helpers_26 = helpers.convertArea;
55163   var helpers_27 = helpers.isNumber;
55164   var helpers_28 = helpers.isObject;
55165   var helpers_29 = helpers.validateBBox;
55166   var helpers_30 = helpers.validateId;
55167   var helpers_31 = helpers.radians2degrees;
55168   var helpers_32 = helpers.degrees2radians;
55169   var helpers_33 = helpers.distanceToDegrees;
55170   var helpers_34 = helpers.distanceToRadians;
55171   var helpers_35 = helpers.radiansToDistance;
55172   var helpers_36 = helpers.bearingToAngle;
55173   var helpers_37 = helpers.convertDistance;
55174
55175   var invariant = createCommonjsModule(function (module, exports) {
55176   Object.defineProperty(exports, "__esModule", { value: true });
55177
55178   /**
55179    * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.
55180    *
55181    * @name getCoord
55182    * @param {Array<number>|Geometry<Point>|Feature<Point>} coord GeoJSON Point or an Array of numbers
55183    * @returns {Array<number>} coordinates
55184    * @example
55185    * var pt = turf.point([10, 10]);
55186    *
55187    * var coord = turf.getCoord(pt);
55188    * //= [10, 10]
55189    */
55190   function getCoord(coord) {
55191       if (!coord) {
55192           throw new Error("coord is required");
55193       }
55194       if (!Array.isArray(coord)) {
55195           if (coord.type === "Feature" && coord.geometry !== null && coord.geometry.type === "Point") {
55196               return coord.geometry.coordinates;
55197           }
55198           if (coord.type === "Point") {
55199               return coord.coordinates;
55200           }
55201       }
55202       if (Array.isArray(coord) && coord.length >= 2 && !Array.isArray(coord[0]) && !Array.isArray(coord[1])) {
55203           return coord;
55204       }
55205       throw new Error("coord must be GeoJSON Point or an Array of numbers");
55206   }
55207   exports.getCoord = getCoord;
55208   /**
55209    * Unwrap coordinates from a Feature, Geometry Object or an Array
55210    *
55211    * @name getCoords
55212    * @param {Array<any>|Geometry|Feature} coords Feature, Geometry Object or an Array
55213    * @returns {Array<any>} coordinates
55214    * @example
55215    * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);
55216    *
55217    * var coords = turf.getCoords(poly);
55218    * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]
55219    */
55220   function getCoords(coords) {
55221       if (Array.isArray(coords)) {
55222           return coords;
55223       }
55224       // Feature
55225       if (coords.type === "Feature") {
55226           if (coords.geometry !== null) {
55227               return coords.geometry.coordinates;
55228           }
55229       }
55230       else {
55231           // Geometry
55232           if (coords.coordinates) {
55233               return coords.coordinates;
55234           }
55235       }
55236       throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array");
55237   }
55238   exports.getCoords = getCoords;
55239   /**
55240    * Checks if coordinates contains a number
55241    *
55242    * @name containsNumber
55243    * @param {Array<any>} coordinates GeoJSON Coordinates
55244    * @returns {boolean} true if Array contains a number
55245    */
55246   function containsNumber(coordinates) {
55247       if (coordinates.length > 1 && helpers.isNumber(coordinates[0]) && helpers.isNumber(coordinates[1])) {
55248           return true;
55249       }
55250       if (Array.isArray(coordinates[0]) && coordinates[0].length) {
55251           return containsNumber(coordinates[0]);
55252       }
55253       throw new Error("coordinates must only contain numbers");
55254   }
55255   exports.containsNumber = containsNumber;
55256   /**
55257    * Enforce expectations about types of GeoJSON objects for Turf.
55258    *
55259    * @name geojsonType
55260    * @param {GeoJSON} value any GeoJSON object
55261    * @param {string} type expected GeoJSON type
55262    * @param {string} name name of calling function
55263    * @throws {Error} if value is not the expected type.
55264    */
55265   function geojsonType(value, type, name) {
55266       if (!type || !name) {
55267           throw new Error("type and name required");
55268       }
55269       if (!value || value.type !== type) {
55270           throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + value.type);
55271       }
55272   }
55273   exports.geojsonType = geojsonType;
55274   /**
55275    * Enforce expectations about types of {@link Feature} inputs for Turf.
55276    * Internally this uses {@link geojsonType} to judge geometry types.
55277    *
55278    * @name featureOf
55279    * @param {Feature} feature a feature with an expected geometry type
55280    * @param {string} type expected GeoJSON type
55281    * @param {string} name name of calling function
55282    * @throws {Error} error if value is not the expected type.
55283    */
55284   function featureOf(feature, type, name) {
55285       if (!feature) {
55286           throw new Error("No feature passed");
55287       }
55288       if (!name) {
55289           throw new Error(".featureOf() requires a name");
55290       }
55291       if (!feature || feature.type !== "Feature" || !feature.geometry) {
55292           throw new Error("Invalid input to " + name + ", Feature with geometry required");
55293       }
55294       if (!feature.geometry || feature.geometry.type !== type) {
55295           throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
55296       }
55297   }
55298   exports.featureOf = featureOf;
55299   /**
55300    * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.
55301    * Internally this uses {@link geojsonType} to judge geometry types.
55302    *
55303    * @name collectionOf
55304    * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged
55305    * @param {string} type expected GeoJSON type
55306    * @param {string} name name of calling function
55307    * @throws {Error} if value is not the expected type.
55308    */
55309   function collectionOf(featureCollection, type, name) {
55310       if (!featureCollection) {
55311           throw new Error("No featureCollection passed");
55312       }
55313       if (!name) {
55314           throw new Error(".collectionOf() requires a name");
55315       }
55316       if (!featureCollection || featureCollection.type !== "FeatureCollection") {
55317           throw new Error("Invalid input to " + name + ", FeatureCollection required");
55318       }
55319       for (var _i = 0, _a = featureCollection.features; _i < _a.length; _i++) {
55320           var feature = _a[_i];
55321           if (!feature || feature.type !== "Feature" || !feature.geometry) {
55322               throw new Error("Invalid input to " + name + ", Feature with geometry required");
55323           }
55324           if (!feature.geometry || feature.geometry.type !== type) {
55325               throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
55326           }
55327       }
55328   }
55329   exports.collectionOf = collectionOf;
55330   /**
55331    * Get Geometry from Feature or Geometry Object
55332    *
55333    * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object
55334    * @returns {Geometry|null} GeoJSON Geometry Object
55335    * @throws {Error} if geojson is not a Feature or Geometry Object
55336    * @example
55337    * var point = {
55338    *   "type": "Feature",
55339    *   "properties": {},
55340    *   "geometry": {
55341    *     "type": "Point",
55342    *     "coordinates": [110, 40]
55343    *   }
55344    * }
55345    * var geom = turf.getGeom(point)
55346    * //={"type": "Point", "coordinates": [110, 40]}
55347    */
55348   function getGeom(geojson) {
55349       if (geojson.type === "Feature") {
55350           return geojson.geometry;
55351       }
55352       return geojson;
55353   }
55354   exports.getGeom = getGeom;
55355   /**
55356    * Get GeoJSON object's type, Geometry type is prioritize.
55357    *
55358    * @param {GeoJSON} geojson GeoJSON object
55359    * @param {string} [name="geojson"] name of the variable to display in error message
55360    * @returns {string} GeoJSON type
55361    * @example
55362    * var point = {
55363    *   "type": "Feature",
55364    *   "properties": {},
55365    *   "geometry": {
55366    *     "type": "Point",
55367    *     "coordinates": [110, 40]
55368    *   }
55369    * }
55370    * var geom = turf.getType(point)
55371    * //="Point"
55372    */
55373   function getType(geojson, name) {
55374       if (geojson.type === "FeatureCollection") {
55375           return "FeatureCollection";
55376       }
55377       if (geojson.type === "GeometryCollection") {
55378           return "GeometryCollection";
55379       }
55380       if (geojson.type === "Feature" && geojson.geometry !== null) {
55381           return geojson.geometry.type;
55382       }
55383       return geojson.type;
55384   }
55385   exports.getType = getType;
55386   });
55387
55388   unwrapExports(invariant);
55389   var invariant_1 = invariant.getCoord;
55390   var invariant_2 = invariant.getCoords;
55391   var invariant_3 = invariant.containsNumber;
55392   var invariant_4 = invariant.geojsonType;
55393   var invariant_5 = invariant.featureOf;
55394   var invariant_6 = invariant.collectionOf;
55395   var invariant_7 = invariant.getGeom;
55396   var invariant_8 = invariant.getType;
55397
55398   var lineclip_1$1 = lineclip$1;
55399   var default_1$1 = lineclip$1;
55400
55401   lineclip$1.polyline = lineclip$1;
55402   lineclip$1.polygon = polygonclip$1;
55403
55404
55405   // Cohen-Sutherland line clippign algorithm, adapted to efficiently
55406   // handle polylines rather than just segments
55407
55408   function lineclip$1(points, bbox, result) {
55409
55410       var len = points.length,
55411           codeA = bitCode$1(points[0], bbox),
55412           part = [],
55413           i, a, b, codeB, lastCode;
55414
55415       if (!result) result = [];
55416
55417       for (i = 1; i < len; i++) {
55418           a = points[i - 1];
55419           b = points[i];
55420           codeB = lastCode = bitCode$1(b, bbox);
55421
55422           while (true) {
55423
55424               if (!(codeA | codeB)) { // accept
55425                   part.push(a);
55426
55427                   if (codeB !== lastCode) { // segment went outside
55428                       part.push(b);
55429
55430                       if (i < len - 1) { // start a new line
55431                           result.push(part);
55432                           part = [];
55433                       }
55434                   } else if (i === len - 1) {
55435                       part.push(b);
55436                   }
55437                   break;
55438
55439               } else if (codeA & codeB) { // trivial reject
55440                   break;
55441
55442               } else if (codeA) { // a outside, intersect with clip edge
55443                   a = intersect$2(a, b, codeA, bbox);
55444                   codeA = bitCode$1(a, bbox);
55445
55446               } else { // b outside
55447                   b = intersect$2(a, b, codeB, bbox);
55448                   codeB = bitCode$1(b, bbox);
55449               }
55450           }
55451
55452           codeA = lastCode;
55453       }
55454
55455       if (part.length) result.push(part);
55456
55457       return result;
55458   }
55459
55460   // Sutherland-Hodgeman polygon clipping algorithm
55461
55462   function polygonclip$1(points, bbox) {
55463
55464       var result, edge, prev, prevInside, i, p, inside;
55465
55466       // clip against each side of the clip rectangle
55467       for (edge = 1; edge <= 8; edge *= 2) {
55468           result = [];
55469           prev = points[points.length - 1];
55470           prevInside = !(bitCode$1(prev, bbox) & edge);
55471
55472           for (i = 0; i < points.length; i++) {
55473               p = points[i];
55474               inside = !(bitCode$1(p, bbox) & edge);
55475
55476               // if segment goes through the clip window, add an intersection
55477               if (inside !== prevInside) result.push(intersect$2(prev, p, edge, bbox));
55478
55479               if (inside) result.push(p); // add a point if it's inside
55480
55481               prev = p;
55482               prevInside = inside;
55483           }
55484
55485           points = result;
55486
55487           if (!points.length) break;
55488       }
55489
55490       return result;
55491   }
55492
55493   // intersect a segment against one of the 4 lines that make up the bbox
55494
55495   function intersect$2(a, b, edge, bbox) {
55496       return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
55497              edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
55498              edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
55499              edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
55500              null;
55501   }
55502
55503   // bit code reflects the point position relative to the bbox:
55504
55505   //         left  mid  right
55506   //    top  1001  1000  1010
55507   //    mid  0001  0000  0010
55508   // bottom  0101  0100  0110
55509
55510   function bitCode$1(p, bbox) {
55511       var code = 0;
55512
55513       if (p[0] < bbox[0]) code |= 1; // left
55514       else if (p[0] > bbox[2]) code |= 2; // right
55515
55516       if (p[1] < bbox[1]) code |= 4; // bottom
55517       else if (p[1] > bbox[3]) code |= 8; // top
55518
55519       return code;
55520   }
55521   lineclip_1$1.default = default_1$1;
55522
55523   var bboxClip_1 = createCommonjsModule(function (module, exports) {
55524   var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
55525       if (mod && mod.__esModule) return mod;
55526       var result = {};
55527       if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
55528       result["default"] = mod;
55529       return result;
55530   };
55531   Object.defineProperty(exports, "__esModule", { value: true });
55532
55533
55534   var lineclip = __importStar(lineclip_1$1);
55535   /**
55536    * Takes a {@link Feature} and a bbox and clips the feature to the bbox using
55537    * [lineclip](https://github.com/mapbox/lineclip).
55538    * May result in degenerate edges when clipping Polygons.
55539    *
55540    * @name bboxClip
55541    * @param {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} feature feature to clip to the bbox
55542    * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order
55543    * @returns {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} clipped Feature
55544    * @example
55545    * var bbox = [0, 0, 10, 10];
55546    * var poly = turf.polygon([[[2, 2], [8, 4], [12, 8], [3, 7], [2, 2]]]);
55547    *
55548    * var clipped = turf.bboxClip(poly, bbox);
55549    *
55550    * //addToMap
55551    * var addToMap = [bbox, poly, clipped]
55552    */
55553   function bboxClip(feature, bbox) {
55554       var geom = invariant.getGeom(feature);
55555       var type = geom.type;
55556       var properties = feature.type === "Feature" ? feature.properties : {};
55557       var coords = geom.coordinates;
55558       switch (type) {
55559           case "LineString":
55560           case "MultiLineString":
55561               var lines_1 = [];
55562               if (type === "LineString") {
55563                   coords = [coords];
55564               }
55565               coords.forEach(function (line) {
55566                   lineclip.polyline(line, bbox, lines_1);
55567               });
55568               if (lines_1.length === 1) {
55569                   return helpers.lineString(lines_1[0], properties);
55570               }
55571               return helpers.multiLineString(lines_1, properties);
55572           case "Polygon":
55573               return helpers.polygon(clipPolygon(coords, bbox), properties);
55574           case "MultiPolygon":
55575               return helpers.multiPolygon(coords.map(function (poly) {
55576                   return clipPolygon(poly, bbox);
55577               }), properties);
55578           default:
55579               throw new Error("geometry " + type + " not supported");
55580       }
55581   }
55582   exports.default = bboxClip;
55583   function clipPolygon(rings, bbox) {
55584       var outRings = [];
55585       for (var _i = 0, rings_1 = rings; _i < rings_1.length; _i++) {
55586           var ring = rings_1[_i];
55587           var clipped = lineclip.polygon(ring, bbox);
55588           if (clipped.length > 0) {
55589               if (clipped[0][0] !== clipped[clipped.length - 1][0] || clipped[0][1] !== clipped[clipped.length - 1][1]) {
55590                   clipped.push(clipped[0]);
55591               }
55592               if (clipped.length >= 4) {
55593                   outRings.push(clipped);
55594               }
55595           }
55596       }
55597       return outRings;
55598   }
55599   });
55600
55601   var turf_bboxClip = unwrapExports(bboxClip_1);
55602
55603   var martinez_umd = createCommonjsModule(function (module, exports) {
55604   /**
55605    * martinez v0.5.0
55606    * Martinez polygon clipping algorithm, does boolean operation on polygons (multipolygons, polygons with holes etc): intersection, union, difference, xor
55607    *
55608    * @author Alex Milevski <info@w8r.name>
55609    * @license MIT
55610    * @preserve
55611    */
55612
55613   (function (global, factory) {
55614     factory(exports);
55615   }(commonjsGlobal, (function (exports) {
55616     function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }
55617
55618     var SplayTree = function SplayTree(compare, noDuplicates) {
55619       if ( compare === void 0 ) compare = DEFAULT_COMPARE;
55620       if ( noDuplicates === void 0 ) noDuplicates = false;
55621
55622       this._compare = compare;
55623       this._root = null;
55624       this._size = 0;
55625       this._noDuplicates = !!noDuplicates;
55626     };
55627
55628     var prototypeAccessors = { size: { configurable: true } };
55629
55630
55631     SplayTree.prototype.rotateLeft = function rotateLeft (x) {
55632       var y = x.right;
55633       if (y) {
55634         x.right = y.left;
55635         if (y.left) { y.left.parent = x; }
55636         y.parent = x.parent;
55637       }
55638
55639       if (!x.parent)              { this._root = y; }
55640       else if (x === x.parent.left) { x.parent.left = y; }
55641       else                        { x.parent.right = y; }
55642       if (y) { y.left = x; }
55643       x.parent = y;
55644     };
55645
55646
55647     SplayTree.prototype.rotateRight = function rotateRight (x) {
55648       var y = x.left;
55649       if (y) {
55650         x.left = y.right;
55651         if (y.right) { y.right.parent = x; }
55652         y.parent = x.parent;
55653       }
55654
55655       if (!x.parent)             { this._root = y; }
55656       else if(x === x.parent.left) { x.parent.left = y; }
55657       else                       { x.parent.right = y; }
55658       if (y) { y.right = x; }
55659       x.parent = y;
55660     };
55661
55662
55663     SplayTree.prototype._splay = function _splay (x) {
55664         var this$1 = this;
55665
55666       while (x.parent) {
55667         var p = x.parent;
55668         if (!p.parent) {
55669           if (p.left === x) { this$1.rotateRight(p); }
55670           else            { this$1.rotateLeft(p); }
55671         } else if (p.left === x && p.parent.left === p) {
55672           this$1.rotateRight(p.parent);
55673           this$1.rotateRight(p);
55674         } else if (p.right === x && p.parent.right === p) {
55675           this$1.rotateLeft(p.parent);
55676           this$1.rotateLeft(p);
55677         } else if (p.left === x && p.parent.right === p) {
55678           this$1.rotateRight(p);
55679           this$1.rotateLeft(p);
55680         } else {
55681           this$1.rotateLeft(p);
55682           this$1.rotateRight(p);
55683         }
55684       }
55685     };
55686
55687
55688     SplayTree.prototype.splay = function splay (x) {
55689         var this$1 = this;
55690
55691       var p, gp, ggp, l, r;
55692
55693       while (x.parent) {
55694         p = x.parent;
55695         gp = p.parent;
55696
55697         if (gp && gp.parent) {
55698           ggp = gp.parent;
55699           if (ggp.left === gp) { ggp.left= x; }
55700           else               { ggp.right = x; }
55701           x.parent = ggp;
55702         } else {
55703           x.parent = null;
55704           this$1._root = x;
55705         }
55706
55707         l = x.left; r = x.right;
55708
55709         if (x === p.left) { // left
55710           if (gp) {
55711             if (gp.left === p) {
55712               /* zig-zig */
55713               if (p.right) {
55714                 gp.left = p.right;
55715                 gp.left.parent = gp;
55716               } else { gp.left = null; }
55717
55718               p.right = gp;
55719               gp.parent = p;
55720             } else {
55721               /* zig-zag */
55722               if (l) {
55723                 gp.right = l;
55724                 l.parent = gp;
55725               } else { gp.right = null; }
55726
55727               x.left  = gp;
55728               gp.parent = x;
55729             }
55730           }
55731           if (r) {
55732             p.left = r;
55733             r.parent = p;
55734           } else { p.left = null; }
55735
55736           x.right= p;
55737           p.parent = x;
55738         } else { // right
55739           if (gp) {
55740             if (gp.right === p) {
55741               /* zig-zig */
55742               if (p.left) {
55743                 gp.right = p.left;
55744                 gp.right.parent = gp;
55745               } else { gp.right = null; }
55746
55747               p.left = gp;
55748               gp.parent = p;
55749             } else {
55750               /* zig-zag */
55751               if (r) {
55752                 gp.left = r;
55753                 r.parent = gp;
55754               } else { gp.left = null; }
55755
55756               x.right = gp;
55757               gp.parent = x;
55758             }
55759           }
55760           if (l) {
55761             p.right = l;
55762             l.parent = p;
55763           } else { p.right = null; }
55764
55765           x.left = p;
55766           p.parent = x;
55767         }
55768       }
55769     };
55770
55771
55772     SplayTree.prototype.replace = function replace (u, v) {
55773       if (!u.parent) { this._root = v; }
55774       else if (u === u.parent.left) { u.parent.left = v; }
55775       else { u.parent.right = v; }
55776       if (v) { v.parent = u.parent; }
55777     };
55778
55779
55780     SplayTree.prototype.minNode = function minNode (u) {
55781         if ( u === void 0 ) u = this._root;
55782
55783       if (u) { while (u.left) { u = u.left; } }
55784       return u;
55785     };
55786
55787
55788     SplayTree.prototype.maxNode = function maxNode (u) {
55789         if ( u === void 0 ) u = this._root;
55790
55791       if (u) { while (u.right) { u = u.right; } }
55792       return u;
55793     };
55794
55795
55796     SplayTree.prototype.insert = function insert (key, data) {
55797       var z = this._root;
55798       var p = null;
55799       var comp = this._compare;
55800       var cmp;
55801
55802       if (this._noDuplicates) {
55803         while (z) {
55804           p = z;
55805           cmp = comp(z.key, key);
55806           if (cmp === 0) { return; }
55807           else if (comp(z.key, key) < 0) { z = z.right; }
55808           else { z = z.left; }
55809         }
55810       } else {
55811         while (z) {
55812           p = z;
55813           if (comp(z.key, key) < 0) { z = z.right; }
55814           else { z = z.left; }
55815         }
55816       }
55817
55818       z = { key: key, data: data, left: null, right: null, parent: p };
55819
55820       if (!p)                        { this._root = z; }
55821       else if (comp(p.key, z.key) < 0) { p.right = z; }
55822       else                           { p.left= z; }
55823
55824       this.splay(z);
55825       this._size++;
55826       return z;
55827     };
55828
55829
55830     SplayTree.prototype.find = function find (key) {
55831       var z  = this._root;
55832       var comp = this._compare;
55833       while (z) {
55834         var cmp = comp(z.key, key);
55835         if    (cmp < 0) { z = z.right; }
55836         else if (cmp > 0) { z = z.left; }
55837         else            { return z; }
55838       }
55839       return null;
55840     };
55841
55842     /**
55843      * Whether the tree contains a node with the given key
55844      * @param{Key} key
55845      * @return {boolean} true/false
55846      */
55847     SplayTree.prototype.contains = function contains (key) {
55848       var node     = this._root;
55849       var comparator = this._compare;
55850       while (node){
55851         var cmp = comparator(key, node.key);
55852         if    (cmp === 0) { return true; }
55853         else if (cmp < 0) { node = node.left; }
55854         else              { node = node.right; }
55855       }
55856
55857       return false;
55858     };
55859
55860
55861     SplayTree.prototype.remove = function remove (key) {
55862       var z = this.find(key);
55863
55864       if (!z) { return false; }
55865
55866       this.splay(z);
55867
55868       if (!z.left) { this.replace(z, z.right); }
55869       else if (!z.right) { this.replace(z, z.left); }
55870       else {
55871         var y = this.minNode(z.right);
55872         if (y.parent !== z) {
55873           this.replace(y, y.right);
55874           y.right = z.right;
55875           y.right.parent = y;
55876         }
55877         this.replace(z, y);
55878         y.left = z.left;
55879         y.left.parent = y;
55880       }
55881
55882       this._size--;
55883       return true;
55884     };
55885
55886
55887     SplayTree.prototype.removeNode = function removeNode (z) {
55888       if (!z) { return false; }
55889
55890       this.splay(z);
55891
55892       if (!z.left) { this.replace(z, z.right); }
55893       else if (!z.right) { this.replace(z, z.left); }
55894       else {
55895         var y = this.minNode(z.right);
55896         if (y.parent !== z) {
55897           this.replace(y, y.right);
55898           y.right = z.right;
55899           y.right.parent = y;
55900         }
55901         this.replace(z, y);
55902         y.left = z.left;
55903         y.left.parent = y;
55904       }
55905
55906       this._size--;
55907       return true;
55908     };
55909
55910
55911     SplayTree.prototype.erase = function erase (key) {
55912       var z = this.find(key);
55913       if (!z) { return; }
55914
55915       this.splay(z);
55916
55917       var s = z.left;
55918       var t = z.right;
55919
55920       var sMax = null;
55921       if (s) {
55922         s.parent = null;
55923         sMax = this.maxNode(s);
55924         this.splay(sMax);
55925         this._root = sMax;
55926       }
55927       if (t) {
55928         if (s) { sMax.right = t; }
55929         else { this._root = t; }
55930         t.parent = sMax;
55931       }
55932
55933       this._size--;
55934     };
55935
55936     /**
55937      * Removes and returns the node with smallest key
55938      * @return {?Node}
55939      */
55940     SplayTree.prototype.pop = function pop () {
55941       var node = this._root, returnValue = null;
55942       if (node) {
55943         while (node.left) { node = node.left; }
55944         returnValue = { key: node.key, data: node.data };
55945         this.remove(node.key);
55946       }
55947       return returnValue;
55948     };
55949
55950
55951     /* eslint-disable class-methods-use-this */
55952
55953     /**
55954      * Successor node
55955      * @param{Node} node
55956      * @return {?Node}
55957      */
55958     SplayTree.prototype.next = function next (node) {
55959       var successor = node;
55960       if (successor) {
55961         if (successor.right) {
55962           successor = successor.right;
55963           while (successor && successor.left) { successor = successor.left; }
55964         } else {
55965           successor = node.parent;
55966           while (successor && successor.right === node) {
55967             node = successor; successor = successor.parent;
55968           }
55969         }
55970       }
55971       return successor;
55972     };
55973
55974
55975     /**
55976      * Predecessor node
55977      * @param{Node} node
55978      * @return {?Node}
55979      */
55980     SplayTree.prototype.prev = function prev (node) {
55981       var predecessor = node;
55982       if (predecessor) {
55983         if (predecessor.left) {
55984           predecessor = predecessor.left;
55985           while (predecessor && predecessor.right) { predecessor = predecessor.right; }
55986         } else {
55987           predecessor = node.parent;
55988           while (predecessor && predecessor.left === node) {
55989             node = predecessor;
55990             predecessor = predecessor.parent;
55991           }
55992         }
55993       }
55994       return predecessor;
55995     };
55996     /* eslint-enable class-methods-use-this */
55997
55998
55999     /**
56000      * @param{forEachCallback} callback
56001      * @return {SplayTree}
56002      */
56003     SplayTree.prototype.forEach = function forEach (callback) {
56004       var current = this._root;
56005       var s = [], done = false, i = 0;
56006
56007       while (!done) {
56008         // Reach the left most Node of the current Node
56009         if (current) {
56010           // Place pointer to a tree node on the stack
56011           // before traversing the node's left subtree
56012           s.push(current);
56013           current = current.left;
56014         } else {
56015           // BackTrack from the empty subtree and visit the Node
56016           // at the top of the stack; however, if the stack is
56017           // empty you are done
56018           if (s.length > 0) {
56019             current = s.pop();
56020             callback(current, i++);
56021
56022             // We have visited the node and its left
56023             // subtree. Now, it's right subtree's turn
56024             current = current.right;
56025           } else { done = true; }
56026         }
56027       }
56028       return this;
56029     };
56030
56031
56032     /**
56033      * Walk key range from `low` to `high`. Stops if `fn` returns a value.
56034      * @param{Key}    low
56035      * @param{Key}    high
56036      * @param{Function} fn
56037      * @param{*?}     ctx
56038      * @return {SplayTree}
56039      */
56040     SplayTree.prototype.range = function range (low, high, fn, ctx) {
56041         var this$1 = this;
56042
56043       var Q = [];
56044       var compare = this._compare;
56045       var node = this._root, cmp;
56046
56047       while (Q.length !== 0 || node) {
56048         if (node) {
56049           Q.push(node);
56050           node = node.left;
56051         } else {
56052           node = Q.pop();
56053           cmp = compare(node.key, high);
56054           if (cmp > 0) {
56055             break;
56056           } else if (compare(node.key, low) >= 0) {
56057             if (fn.call(ctx, node)) { return this$1; } // stop if smth is returned
56058           }
56059           node = node.right;
56060         }
56061       }
56062       return this;
56063     };
56064
56065     /**
56066      * Returns all keys in order
56067      * @return {Array<Key>}
56068      */
56069     SplayTree.prototype.keys = function keys () {
56070       var current = this._root;
56071       var s = [], r = [], done = false;
56072
56073       while (!done) {
56074         if (current) {
56075           s.push(current);
56076           current = current.left;
56077         } else {
56078           if (s.length > 0) {
56079             current = s.pop();
56080             r.push(current.key);
56081             current = current.right;
56082           } else { done = true; }
56083         }
56084       }
56085       return r;
56086     };
56087
56088
56089     /**
56090      * Returns `data` fields of all nodes in order.
56091      * @return {Array<Value>}
56092      */
56093     SplayTree.prototype.values = function values () {
56094       var current = this._root;
56095       var s = [], r = [], done = false;
56096
56097       while (!done) {
56098         if (current) {
56099           s.push(current);
56100           current = current.left;
56101         } else {
56102           if (s.length > 0) {
56103             current = s.pop();
56104             r.push(current.data);
56105             current = current.right;
56106           } else { done = true; }
56107         }
56108       }
56109       return r;
56110     };
56111
56112
56113     /**
56114      * Returns node at given index
56115      * @param{number} index
56116      * @return {?Node}
56117      */
56118     SplayTree.prototype.at = function at (index) {
56119       // removed after a consideration, more misleading than useful
56120       // index = index % this.size;
56121       // if (index < 0) index = this.size - index;
56122
56123       var current = this._root;
56124       var s = [], done = false, i = 0;
56125
56126       while (!done) {
56127         if (current) {
56128           s.push(current);
56129           current = current.left;
56130         } else {
56131           if (s.length > 0) {
56132             current = s.pop();
56133             if (i === index) { return current; }
56134             i++;
56135             current = current.right;
56136           } else { done = true; }
56137         }
56138       }
56139       return null;
56140     };
56141
56142     /**
56143      * Bulk-load items. Both array have to be same size
56144      * @param{Array<Key>}  keys
56145      * @param{Array<Value>}[values]
56146      * @param{Boolean}     [presort=false] Pre-sort keys and values, using
56147      *                                       tree's comparator. Sorting is done
56148      *                                       in-place
56149      * @return {AVLTree}
56150      */
56151     SplayTree.prototype.load = function load (keys, values, presort) {
56152         if ( keys === void 0 ) keys = [];
56153         if ( values === void 0 ) values = [];
56154         if ( presort === void 0 ) presort = false;
56155
56156       if (this._size !== 0) { throw new Error('bulk-load: tree is not empty'); }
56157       var size = keys.length;
56158       if (presort) { sort(keys, values, 0, size - 1, this._compare); }
56159       this._root = loadRecursive(null, keys, values, 0, size);
56160       this._size = size;
56161       return this;
56162     };
56163
56164
56165     SplayTree.prototype.min = function min () {
56166       var node = this.minNode(this._root);
56167       if (node) { return node.key; }
56168       else    { return null; }
56169     };
56170
56171
56172     SplayTree.prototype.max = function max () {
56173       var node = this.maxNode(this._root);
56174       if (node) { return node.key; }
56175       else    { return null; }
56176     };
56177
56178     SplayTree.prototype.isEmpty = function isEmpty () { return this._root === null; };
56179     prototypeAccessors.size.get = function () { return this._size; };
56180
56181
56182     /**
56183      * Create a tree and load it with items
56184      * @param{Array<Key>}        keys
56185      * @param{Array<Value>?}      [values]
56186
56187      * @param{Function?}          [comparator]
56188      * @param{Boolean?}           [presort=false] Pre-sort keys and values, using
56189      *                                             tree's comparator. Sorting is done
56190      *                                             in-place
56191      * @param{Boolean?}           [noDuplicates=false] Allow duplicates
56192      * @return {SplayTree}
56193      */
56194     SplayTree.createTree = function createTree (keys, values, comparator, presort, noDuplicates) {
56195       return new SplayTree(comparator, noDuplicates).load(keys, values, presort);
56196     };
56197
56198     Object.defineProperties( SplayTree.prototype, prototypeAccessors );
56199
56200
56201     function loadRecursive (parent, keys, values, start, end) {
56202       var size = end - start;
56203       if (size > 0) {
56204         var middle = start + Math.floor(size / 2);
56205         var key    = keys[middle];
56206         var data   = values[middle];
56207         var node   = { key: key, data: data, parent: parent };
56208         node.left    = loadRecursive(node, keys, values, start, middle);
56209         node.right   = loadRecursive(node, keys, values, middle + 1, end);
56210         return node;
56211       }
56212       return null;
56213     }
56214
56215
56216     function sort(keys, values, left, right, compare) {
56217       if (left >= right) { return; }
56218
56219       var pivot = keys[(left + right) >> 1];
56220       var i = left - 1;
56221       var j = right + 1;
56222
56223       while (true) {
56224         do { i++; } while (compare(keys[i], pivot) < 0);
56225         do { j--; } while (compare(keys[j], pivot) > 0);
56226         if (i >= j) { break; }
56227
56228         var tmp = keys[i];
56229         keys[i] = keys[j];
56230         keys[j] = tmp;
56231
56232         tmp = values[i];
56233         values[i] = values[j];
56234         values[j] = tmp;
56235       }
56236
56237       sort(keys, values,  left,     j, compare);
56238       sort(keys, values, j + 1, right, compare);
56239     }
56240
56241     var NORMAL               = 0;
56242     var NON_CONTRIBUTING     = 1;
56243     var SAME_TRANSITION      = 2;
56244     var DIFFERENT_TRANSITION = 3;
56245
56246     var INTERSECTION = 0;
56247     var UNION        = 1;
56248     var DIFFERENCE   = 2;
56249     var XOR          = 3;
56250
56251     /**
56252      * @param  {SweepEvent} event
56253      * @param  {SweepEvent} prev
56254      * @param  {Operation} operation
56255      */
56256     function computeFields (event, prev, operation) {
56257       // compute inOut and otherInOut fields
56258       if (prev === null) {
56259         event.inOut      = false;
56260         event.otherInOut = true;
56261
56262       // previous line segment in sweepline belongs to the same polygon
56263       } else {
56264         if (event.isSubject === prev.isSubject) {
56265           event.inOut      = !prev.inOut;
56266           event.otherInOut = prev.otherInOut;
56267
56268         // previous line segment in sweepline belongs to the clipping polygon
56269         } else {
56270           event.inOut      = !prev.otherInOut;
56271           event.otherInOut = prev.isVertical() ? !prev.inOut : prev.inOut;
56272         }
56273
56274         // compute prevInResult field
56275         if (prev) {
56276           event.prevInResult = (!inResult(prev, operation) || prev.isVertical())
56277             ? prev.prevInResult : prev;
56278         }
56279       }
56280
56281       // check if the line segment belongs to the Boolean operation
56282       event.inResult = inResult(event, operation);
56283     }
56284
56285
56286     /* eslint-disable indent */
56287     function inResult(event, operation) {
56288       switch (event.type) {
56289         case NORMAL:
56290           switch (operation) {
56291             case INTERSECTION:
56292               return !event.otherInOut;
56293             case UNION:
56294               return event.otherInOut;
56295             case DIFFERENCE:
56296               // return (event.isSubject && !event.otherInOut) ||
56297               //         (!event.isSubject && event.otherInOut);
56298               return (event.isSubject && event.otherInOut) ||
56299                       (!event.isSubject && !event.otherInOut);
56300             case XOR:
56301               return true;
56302           }
56303           break;
56304         case SAME_TRANSITION:
56305           return operation === INTERSECTION || operation === UNION;
56306         case DIFFERENT_TRANSITION:
56307           return operation === DIFFERENCE;
56308         case NON_CONTRIBUTING:
56309           return false;
56310       }
56311       return false;
56312     }
56313     /* eslint-enable indent */
56314
56315     var SweepEvent = function SweepEvent (point, left, otherEvent, isSubject, edgeType) {
56316
56317       /**
56318        * Is left endpoint?
56319        * @type {Boolean}
56320        */
56321       this.left = left;
56322
56323       /**
56324        * @type {Array.<Number>}
56325        */
56326       this.point = point;
56327
56328       /**
56329        * Other edge reference
56330        * @type {SweepEvent}
56331        */
56332       this.otherEvent = otherEvent;
56333
56334       /**
56335        * Belongs to source or clipping polygon
56336        * @type {Boolean}
56337        */
56338       this.isSubject = isSubject;
56339
56340       /**
56341        * Edge contribution type
56342        * @type {Number}
56343        */
56344       this.type = edgeType || NORMAL;
56345
56346
56347       /**
56348        * In-out transition for the sweepline crossing polygon
56349        * @type {Boolean}
56350        */
56351       this.inOut = false;
56352
56353
56354       /**
56355        * @type {Boolean}
56356        */
56357       this.otherInOut = false;
56358
56359       /**
56360        * Previous event in result?
56361        * @type {SweepEvent}
56362        */
56363       this.prevInResult = null;
56364
56365       /**
56366        * Does event belong to result?
56367        * @type {Boolean}
56368        */
56369       this.inResult = false;
56370
56371
56372       // connection step
56373
56374       /**
56375        * @type {Boolean}
56376        */
56377       this.resultInOut = false;
56378
56379       this.isExteriorRing = true;
56380     };
56381
56382
56383     /**
56384      * @param{Array.<Number>}p
56385      * @return {Boolean}
56386      */
56387     SweepEvent.prototype.isBelow = function isBelow (p) {
56388       var p0 = this.point, p1 = this.otherEvent.point;
56389       return this.left
56390         ? (p0[0] - p[0]) * (p1[1] - p[1]) - (p1[0] - p[0]) * (p0[1] - p[1]) > 0
56391         // signedArea(this.point, this.otherEvent.point, p) > 0 :
56392         : (p1[0] - p[0]) * (p0[1] - p[1]) - (p0[0] - p[0]) * (p1[1] - p[1]) > 0;
56393         //signedArea(this.otherEvent.point, this.point, p) > 0;
56394     };
56395
56396
56397     /**
56398      * @param{Array.<Number>}p
56399      * @return {Boolean}
56400      */
56401     SweepEvent.prototype.isAbove = function isAbove (p) {
56402       return !this.isBelow(p);
56403     };
56404
56405
56406     /**
56407      * @return {Boolean}
56408      */
56409     SweepEvent.prototype.isVertical = function isVertical () {
56410       return this.point[0] === this.otherEvent.point[0];
56411     };
56412
56413
56414     SweepEvent.prototype.clone = function clone () {
56415       var copy = new SweepEvent(
56416         this.point, this.left, this.otherEvent, this.isSubject, this.type);
56417
56418       copy.inResult     = this.inResult;
56419       copy.prevInResult = this.prevInResult;
56420       copy.isExteriorRing = this.isExteriorRing;
56421       copy.inOut        = this.inOut;
56422       copy.otherInOut   = this.otherInOut;
56423
56424       return copy;
56425     };
56426
56427     function equals(p1, p2) {
56428       if (p1[0] === p2[0]) {
56429         if (p1[1] === p2[1]) {
56430           return true;
56431         } else {
56432           return false;
56433         }
56434       }
56435       return false;
56436     }
56437
56438     // const EPSILON = 1e-9;
56439     // const abs = Math.abs;
56440     // TODO https://github.com/w8r/martinez/issues/6#issuecomment-262847164
56441     // Precision problem.
56442     //
56443     // module.exports = function equals(p1, p2) {
56444     //   return abs(p1[0] - p2[0]) <= EPSILON && abs(p1[1] - p2[1]) <= EPSILON;
56445     // };
56446
56447     /**
56448      * Signed area of the triangle (p0, p1, p2)
56449      * @param  {Array.<Number>} p0
56450      * @param  {Array.<Number>} p1
56451      * @param  {Array.<Number>} p2
56452      * @return {Number}
56453      */
56454     function signedArea(p0, p1, p2) {
56455       return (p0[0] - p2[0]) * (p1[1] - p2[1]) - (p1[0] - p2[0]) * (p0[1] - p2[1]);
56456     }
56457
56458     /**
56459      * @param  {SweepEvent} e1
56460      * @param  {SweepEvent} e2
56461      * @return {Number}
56462      */
56463     function compareEvents(e1, e2) {
56464       var p1 = e1.point;
56465       var p2 = e2.point;
56466
56467       // Different x-coordinate
56468       if (p1[0] > p2[0]) { return 1; }
56469       if (p1[0] < p2[0]) { return -1; }
56470
56471       // Different points, but same x-coordinate
56472       // Event with lower y-coordinate is processed first
56473       if (p1[1] !== p2[1]) { return p1[1] > p2[1] ? 1 : -1; }
56474
56475       return specialCases(e1, e2, p1, p2);
56476     }
56477
56478
56479     /* eslint-disable no-unused-vars */
56480     function specialCases(e1, e2, p1, p2) {
56481       // Same coordinates, but one is a left endpoint and the other is
56482       // a right endpoint. The right endpoint is processed first
56483       if (e1.left !== e2.left)
56484         { return e1.left ? 1 : -1; }
56485
56486       // const p2 = e1.otherEvent.point, p3 = e2.otherEvent.point;
56487       // const sa = (p1[0] - p3[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p3[1])
56488       // Same coordinates, both events
56489       // are left endpoints or right endpoints.
56490       // not collinear
56491       if (signedArea(p1, e1.otherEvent.point, e2.otherEvent.point) !== 0) {
56492         // the event associate to the bottom segment is processed first
56493         return (!e1.isBelow(e2.otherEvent.point)) ? 1 : -1;
56494       }
56495
56496       return (!e1.isSubject && e2.isSubject) ? 1 : -1;
56497     }
56498     /* eslint-enable no-unused-vars */
56499
56500     /**
56501      * @param  {SweepEvent} se
56502      * @param  {Array.<Number>} p
56503      * @param  {Queue} queue
56504      * @return {Queue}
56505      */
56506     function divideSegment(se, p, queue)  {
56507       var r = new SweepEvent(p, false, se,            se.isSubject);
56508       var l = new SweepEvent(p, true,  se.otherEvent, se.isSubject);
56509
56510       /* eslint-disable no-console */
56511       if (equals(se.point, se.otherEvent.point)) {
56512
56513         console.warn('what is that, a collapsed segment?', se);
56514       }
56515       /* eslint-enable no-console */
56516
56517       r.contourId = l.contourId = se.contourId;
56518
56519       // avoid a rounding error. The left event would be processed after the right event
56520       if (compareEvents(l, se.otherEvent) > 0) {
56521         se.otherEvent.left = true;
56522         l.left = false;
56523       }
56524
56525       // avoid a rounding error. The left event would be processed after the right event
56526       // if (compareEvents(se, r) > 0) {}
56527
56528       se.otherEvent.otherEvent = l;
56529       se.otherEvent = r;
56530
56531       queue.push(l);
56532       queue.push(r);
56533
56534       return queue;
56535     }
56536
56537     //const EPS = 1e-9;
56538
56539     /**
56540      * Finds the magnitude of the cross product of two vectors (if we pretend
56541      * they're in three dimensions)
56542      *
56543      * @param {Object} a First vector
56544      * @param {Object} b Second vector
56545      * @private
56546      * @returns {Number} The magnitude of the cross product
56547      */
56548     function crossProduct(a, b) {
56549       return (a[0] * b[1]) - (a[1] * b[0]);
56550     }
56551
56552     /**
56553      * Finds the dot product of two vectors.
56554      *
56555      * @param {Object} a First vector
56556      * @param {Object} b Second vector
56557      * @private
56558      * @returns {Number} The dot product
56559      */
56560     function dotProduct(a, b) {
56561       return (a[0] * b[0]) + (a[1] * b[1]);
56562     }
56563
56564     /**
56565      * Finds the intersection (if any) between two line segments a and b, given the
56566      * line segments' end points a1, a2 and b1, b2.
56567      *
56568      * This algorithm is based on Schneider and Eberly.
56569      * http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf
56570      * Page 244.
56571      *
56572      * @param {Array.<Number>} a1 point of first line
56573      * @param {Array.<Number>} a2 point of first line
56574      * @param {Array.<Number>} b1 point of second line
56575      * @param {Array.<Number>} b2 point of second line
56576      * @param {Boolean=}       noEndpointTouch whether to skip single touchpoints
56577      *                                         (meaning connected segments) as
56578      *                                         intersections
56579      * @returns {Array.<Array.<Number>>|Null} If the lines intersect, the point of
56580      * intersection. If they overlap, the two end points of the overlapping segment.
56581      * Otherwise, null.
56582      */
56583     function intersection (a1, a2, b1, b2, noEndpointTouch) {
56584       // The algorithm expects our lines in the form P + sd, where P is a point,
56585       // s is on the interval [0, 1], and d is a vector.
56586       // We are passed two points. P can be the first point of each pair. The
56587       // vector, then, could be thought of as the distance (in x and y components)
56588       // from the first point to the second point.
56589       // So first, let's make our vectors:
56590       var va = [a2[0] - a1[0], a2[1] - a1[1]];
56591       var vb = [b2[0] - b1[0], b2[1] - b1[1]];
56592       // We also define a function to convert back to regular point form:
56593
56594       /* eslint-disable arrow-body-style */
56595
56596       function toPoint(p, s, d) {
56597         return [
56598           p[0] + s * d[0],
56599           p[1] + s * d[1]
56600         ];
56601       }
56602
56603       /* eslint-enable arrow-body-style */
56604
56605       // The rest is pretty much a straight port of the algorithm.
56606       var e = [b1[0] - a1[0], b1[1] - a1[1]];
56607       var kross    = crossProduct(va, vb);
56608       var sqrKross = kross * kross;
56609       var sqrLenA  = dotProduct(va, va);
56610       //const sqrLenB  = dotProduct(vb, vb);
56611
56612       // Check for line intersection. This works because of the properties of the
56613       // cross product -- specifically, two vectors are parallel if and only if the
56614       // cross product is the 0 vector. The full calculation involves relative error
56615       // to account for possible very small line segments. See Schneider & Eberly
56616       // for details.
56617       if (sqrKross > 0/* EPS * sqrLenB * sqLenA */) {
56618         // If they're not parallel, then (because these are line segments) they
56619         // still might not actually intersect. This code checks that the
56620         // intersection point of the lines is actually on both line segments.
56621         var s = crossProduct(e, vb) / kross;
56622         if (s < 0 || s > 1) {
56623           // not on line segment a
56624           return null;
56625         }
56626         var t = crossProduct(e, va) / kross;
56627         if (t < 0 || t > 1) {
56628           // not on line segment b
56629           return null;
56630         }
56631         if (s === 0 || s === 1) {
56632           // on an endpoint of line segment a
56633           return noEndpointTouch ? null : [toPoint(a1, s, va)];
56634         }
56635         if (t === 0 || t === 1) {
56636           // on an endpoint of line segment b
56637           return noEndpointTouch ? null : [toPoint(b1, t, vb)];
56638         }
56639         return [toPoint(a1, s, va)];
56640       }
56641
56642       // If we've reached this point, then the lines are either parallel or the
56643       // same, but the segments could overlap partially or fully, or not at all.
56644       // So we need to find the overlap, if any. To do that, we can use e, which is
56645       // the (vector) difference between the two initial points. If this is parallel
56646       // with the line itself, then the two lines are the same line, and there will
56647       // be overlap.
56648       //const sqrLenE = dotProduct(e, e);
56649       kross = crossProduct(e, va);
56650       sqrKross = kross * kross;
56651
56652       if (sqrKross > 0 /* EPS * sqLenB * sqLenE */) {
56653       // Lines are just parallel, not the same. No overlap.
56654         return null;
56655       }
56656
56657       var sa = dotProduct(va, e) / sqrLenA;
56658       var sb = sa + dotProduct(va, vb) / sqrLenA;
56659       var smin = Math.min(sa, sb);
56660       var smax = Math.max(sa, sb);
56661
56662       // this is, essentially, the FindIntersection acting on floats from
56663       // Schneider & Eberly, just inlined into this function.
56664       if (smin <= 1 && smax >= 0) {
56665
56666         // overlap on an end point
56667         if (smin === 1) {
56668           return noEndpointTouch ? null : [toPoint(a1, smin > 0 ? smin : 0, va)];
56669         }
56670
56671         if (smax === 0) {
56672           return noEndpointTouch ? null : [toPoint(a1, smax < 1 ? smax : 1, va)];
56673         }
56674
56675         if (noEndpointTouch && smin === 0 && smax === 1) { return null; }
56676
56677         // There's overlap on a segment -- two points of intersection. Return both.
56678         return [
56679           toPoint(a1, smin > 0 ? smin : 0, va),
56680           toPoint(a1, smax < 1 ? smax : 1, va)
56681         ];
56682       }
56683
56684       return null;
56685     }
56686
56687     /**
56688      * @param  {SweepEvent} se1
56689      * @param  {SweepEvent} se2
56690      * @param  {Queue}      queue
56691      * @return {Number}
56692      */
56693     function possibleIntersection (se1, se2, queue) {
56694       // that disallows self-intersecting polygons,
56695       // did cost us half a day, so I'll leave it
56696       // out of respect
56697       // if (se1.isSubject === se2.isSubject) return;
56698       var inter = intersection(
56699         se1.point, se1.otherEvent.point,
56700         se2.point, se2.otherEvent.point
56701       );
56702
56703       var nintersections = inter ? inter.length : 0;
56704       if (nintersections === 0) { return 0; } // no intersection
56705
56706       // the line segments intersect at an endpoint of both line segments
56707       if ((nintersections === 1) &&
56708           (equals(se1.point, se2.point) ||
56709            equals(se1.otherEvent.point, se2.otherEvent.point))) {
56710         return 0;
56711       }
56712
56713       if (nintersections === 2 && se1.isSubject === se2.isSubject) {
56714         // if(se1.contourId === se2.contourId){
56715         // console.warn('Edges of the same polygon overlap',
56716         //   se1.point, se1.otherEvent.point, se2.point, se2.otherEvent.point);
56717         // }
56718         //throw new Error('Edges of the same polygon overlap');
56719         return 0;
56720       }
56721
56722       // The line segments associated to se1 and se2 intersect
56723       if (nintersections === 1) {
56724
56725         // if the intersection point is not an endpoint of se1
56726         if (!equals(se1.point, inter[0]) && !equals(se1.otherEvent.point, inter[0])) {
56727           divideSegment(se1, inter[0], queue);
56728         }
56729
56730         // if the intersection point is not an endpoint of se2
56731         if (!equals(se2.point, inter[0]) && !equals(se2.otherEvent.point, inter[0])) {
56732           divideSegment(se2, inter[0], queue);
56733         }
56734         return 1;
56735       }
56736
56737       // The line segments associated to se1 and se2 overlap
56738       var events        = [];
56739       var leftCoincide  = false;
56740       var rightCoincide = false;
56741
56742       if (equals(se1.point, se2.point)) {
56743         leftCoincide = true; // linked
56744       } else if (compareEvents(se1, se2) === 1) {
56745         events.push(se2, se1);
56746       } else {
56747         events.push(se1, se2);
56748       }
56749
56750       if (equals(se1.otherEvent.point, se2.otherEvent.point)) {
56751         rightCoincide = true;
56752       } else if (compareEvents(se1.otherEvent, se2.otherEvent) === 1) {
56753         events.push(se2.otherEvent, se1.otherEvent);
56754       } else {
56755         events.push(se1.otherEvent, se2.otherEvent);
56756       }
56757
56758       if ((leftCoincide && rightCoincide) || leftCoincide) {
56759         // both line segments are equal or share the left endpoint
56760         se2.type = NON_CONTRIBUTING;
56761         se1.type = (se2.inOut === se1.inOut)
56762           ? SAME_TRANSITION : DIFFERENT_TRANSITION;
56763
56764         if (leftCoincide && !rightCoincide) {
56765           // honestly no idea, but changing events selection from [2, 1]
56766           // to [0, 1] fixes the overlapping self-intersecting polygons issue
56767           divideSegment(events[1].otherEvent, events[0].point, queue);
56768         }
56769         return 2;
56770       }
56771
56772       // the line segments share the right endpoint
56773       if (rightCoincide) {
56774         divideSegment(events[0], events[1].point, queue);
56775         return 3;
56776       }
56777
56778       // no line segment includes totally the other one
56779       if (events[0] !== events[3].otherEvent) {
56780         divideSegment(events[0], events[1].point, queue);
56781         divideSegment(events[1], events[2].point, queue);
56782         return 3;
56783       }
56784
56785       // one line segment includes the other one
56786       divideSegment(events[0], events[1].point, queue);
56787       divideSegment(events[3].otherEvent, events[2].point, queue);
56788
56789       return 3;
56790     }
56791
56792     /**
56793      * @param  {SweepEvent} le1
56794      * @param  {SweepEvent} le2
56795      * @return {Number}
56796      */
56797     function compareSegments(le1, le2) {
56798       if (le1 === le2) { return 0; }
56799
56800       // Segments are not collinear
56801       if (signedArea(le1.point, le1.otherEvent.point, le2.point) !== 0 ||
56802         signedArea(le1.point, le1.otherEvent.point, le2.otherEvent.point) !== 0) {
56803
56804         // If they share their left endpoint use the right endpoint to sort
56805         if (equals(le1.point, le2.point)) { return le1.isBelow(le2.otherEvent.point) ? -1 : 1; }
56806
56807         // Different left endpoint: use the left endpoint to sort
56808         if (le1.point[0] === le2.point[0]) { return le1.point[1] < le2.point[1] ? -1 : 1; }
56809
56810         // has the line segment associated to e1 been inserted
56811         // into S after the line segment associated to e2 ?
56812         if (compareEvents(le1, le2) === 1) { return le2.isAbove(le1.point) ? -1 : 1; }
56813
56814         // The line segment associated to e2 has been inserted
56815         // into S after the line segment associated to e1
56816         return le1.isBelow(le2.point) ? -1 : 1;
56817       }
56818
56819       if (le1.isSubject === le2.isSubject) { // same polygon
56820         var p1 = le1.point, p2 = le2.point;
56821         if (p1[0] === p2[0] && p1[1] === p2[1]/*equals(le1.point, le2.point)*/) {
56822           p1 = le1.otherEvent.point; p2 = le2.otherEvent.point;
56823           if (p1[0] === p2[0] && p1[1] === p2[1]) { return 0; }
56824           else { return le1.contourId > le2.contourId ? 1 : -1; }
56825         }
56826       } else { // Segments are collinear, but belong to separate polygons
56827         return le1.isSubject ? -1 : 1;
56828       }
56829
56830       return compareEvents(le1, le2) === 1 ? 1 : -1;
56831     }
56832
56833     function subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation) {
56834       var sweepLine = new SplayTree(compareSegments);
56835       var sortedEvents = [];
56836
56837       var rightbound = Math.min(sbbox[2], cbbox[2]);
56838
56839       var prev, next, begin;
56840
56841       while (eventQueue.length !== 0) {
56842         var event = eventQueue.pop();
56843         sortedEvents.push(event);
56844
56845         // optimization by bboxes for intersection and difference goes here
56846         if ((operation === INTERSECTION && event.point[0] > rightbound) ||
56847             (operation === DIFFERENCE   && event.point[0] > sbbox[2])) {
56848           break;
56849         }
56850
56851         if (event.left) {
56852           next  = prev = sweepLine.insert(event);
56853           begin = sweepLine.minNode();
56854
56855           if (prev !== begin) { prev = sweepLine.prev(prev); }
56856           else                { prev = null; }
56857
56858           next = sweepLine.next(next);
56859
56860           var prevEvent = prev ? prev.key : null;
56861           var prevprevEvent = (void 0);
56862           computeFields(event, prevEvent, operation);
56863           if (next) {
56864             if (possibleIntersection(event, next.key, eventQueue) === 2) {
56865               computeFields(event, prevEvent, operation);
56866               computeFields(event, next.key, operation);
56867             }
56868           }
56869
56870           if (prev) {
56871             if (possibleIntersection(prev.key, event, eventQueue) === 2) {
56872               var prevprev = prev;
56873               if (prevprev !== begin) { prevprev = sweepLine.prev(prevprev); }
56874               else                    { prevprev = null; }
56875
56876               prevprevEvent = prevprev ? prevprev.key : null;
56877               computeFields(prevEvent, prevprevEvent, operation);
56878               computeFields(event,     prevEvent,     operation);
56879             }
56880           }
56881         } else {
56882           event = event.otherEvent;
56883           next = prev = sweepLine.find(event);
56884
56885           if (prev && next) {
56886
56887             if (prev !== begin) { prev = sweepLine.prev(prev); }
56888             else                { prev = null; }
56889
56890             next = sweepLine.next(next);
56891             sweepLine.remove(event);
56892
56893             if (next && prev) {
56894               possibleIntersection(prev.key, next.key, eventQueue);
56895             }
56896           }
56897         }
56898       }
56899       return sortedEvents;
56900     }
56901
56902     /**
56903      * @param  {Array.<SweepEvent>} sortedEvents
56904      * @return {Array.<SweepEvent>}
56905      */
56906     function orderEvents(sortedEvents) {
56907       var event, i, len, tmp;
56908       var resultEvents = [];
56909       for (i = 0, len = sortedEvents.length; i < len; i++) {
56910         event = sortedEvents[i];
56911         if ((event.left && event.inResult) ||
56912           (!event.left && event.otherEvent.inResult)) {
56913           resultEvents.push(event);
56914         }
56915       }
56916       // Due to overlapping edges the resultEvents array can be not wholly sorted
56917       var sorted = false;
56918       while (!sorted) {
56919         sorted = true;
56920         for (i = 0, len = resultEvents.length; i < len; i++) {
56921           if ((i + 1) < len &&
56922             compareEvents(resultEvents[i], resultEvents[i + 1]) === 1) {
56923             tmp = resultEvents[i];
56924             resultEvents[i] = resultEvents[i + 1];
56925             resultEvents[i + 1] = tmp;
56926             sorted = false;
56927           }
56928         }
56929       }
56930
56931
56932       for (i = 0, len = resultEvents.length; i < len; i++) {
56933         event = resultEvents[i];
56934         event.pos = i;
56935       }
56936
56937       // imagine, the right event is found in the beginning of the queue,
56938       // when his left counterpart is not marked yet
56939       for (i = 0, len = resultEvents.length; i < len; i++) {
56940         event = resultEvents[i];
56941         if (!event.left) {
56942           tmp = event.pos;
56943           event.pos = event.otherEvent.pos;
56944           event.otherEvent.pos = tmp;
56945         }
56946       }
56947
56948       return resultEvents;
56949     }
56950
56951
56952     /**
56953      * @param  {Number} pos
56954      * @param  {Array.<SweepEvent>} resultEvents
56955      * @param  {Object>}    processed
56956      * @return {Number}
56957      */
56958     function nextPos(pos, resultEvents, processed, origIndex) {
56959       var p, p1;
56960       var newPos = pos + 1;
56961       var length = resultEvents.length;
56962
56963       p  = resultEvents[pos].point;
56964
56965       if (newPos < length)
56966         { p1 = resultEvents[newPos].point; }
56967
56968
56969       // while in range and not the current one by value
56970       while (newPos < length && p1[0] === p[0] && p1[1] === p[1]) {
56971         if (!processed[newPos]) {
56972           return newPos;
56973         } else   {
56974           newPos++;
56975         }
56976         p1 = resultEvents[newPos].point;
56977       }
56978
56979       newPos = pos - 1;
56980
56981       while (processed[newPos] && newPos >= origIndex) {
56982         newPos--;
56983       }
56984       return newPos;
56985     }
56986
56987
56988     /**
56989      * @param  {Array.<SweepEvent>} sortedEvents
56990      * @return {Array.<*>} polygons
56991      */
56992     function connectEdges(sortedEvents, operation) {
56993       var i, len;
56994       var resultEvents = orderEvents(sortedEvents);
56995
56996       // "false"-filled array
56997       var processed = {};
56998       var result = [];
56999       var event;
57000
57001       for (i = 0, len = resultEvents.length; i < len; i++) {
57002         if (processed[i]) { continue; }
57003         var contour = [[]];
57004
57005         if (!resultEvents[i].isExteriorRing) {
57006           if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length === 0) {
57007             result.push(contour);
57008           } else if (result.length === 0) {
57009             result.push([[contour]]);
57010           } else {
57011             result[result.length - 1].push(contour[0]);
57012           }
57013         } else if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length > 1) {
57014           result[result.length - 1].push(contour[0]);
57015         } else {
57016           result.push(contour);
57017         }
57018
57019         var ringId = result.length - 1;
57020         var pos = i;
57021
57022         var initial = resultEvents[i].point;
57023         contour[0].push(initial);
57024
57025         while (pos >= i) {
57026           event = resultEvents[pos];
57027           processed[pos] = true;
57028
57029           if (event.left) {
57030             event.resultInOut = false;
57031             event.contourId   = ringId;
57032           } else {
57033             event.otherEvent.resultInOut = true;
57034             event.otherEvent.contourId   = ringId;
57035           }
57036
57037           pos = event.pos;
57038           processed[pos] = true;
57039           contour[0].push(resultEvents[pos].point);
57040           pos = nextPos(pos, resultEvents, processed, i);
57041         }
57042
57043         pos = pos === -1 ? i : pos;
57044
57045         event = resultEvents[pos];
57046         processed[pos] = processed[event.pos] = true;
57047         event.otherEvent.resultInOut = true;
57048         event.otherEvent.contourId   = ringId;
57049       }
57050
57051       // Handle if the result is a polygon (eg not multipoly)
57052       // Commented it again, let's see what do we mean by that
57053       // if (result.length === 1) result = result[0];
57054       return result;
57055     }
57056
57057     var tinyqueue = TinyQueue;
57058     var default_1 = TinyQueue;
57059
57060     function TinyQueue(data, compare) {
57061         var this$1 = this;
57062
57063         if (!(this instanceof TinyQueue)) { return new TinyQueue(data, compare); }
57064
57065         this.data = data || [];
57066         this.length = this.data.length;
57067         this.compare = compare || defaultCompare;
57068
57069         if (this.length > 0) {
57070             for (var i = (this.length >> 1) - 1; i >= 0; i--) { this$1._down(i); }
57071         }
57072     }
57073
57074     function defaultCompare(a, b) {
57075         return a < b ? -1 : a > b ? 1 : 0;
57076     }
57077
57078     TinyQueue.prototype = {
57079
57080         push: function (item) {
57081             this.data.push(item);
57082             this.length++;
57083             this._up(this.length - 1);
57084         },
57085
57086         pop: function () {
57087             if (this.length === 0) { return undefined; }
57088
57089             var top = this.data[0];
57090             this.length--;
57091
57092             if (this.length > 0) {
57093                 this.data[0] = this.data[this.length];
57094                 this._down(0);
57095             }
57096             this.data.pop();
57097
57098             return top;
57099         },
57100
57101         peek: function () {
57102             return this.data[0];
57103         },
57104
57105         _up: function (pos) {
57106             var data = this.data;
57107             var compare = this.compare;
57108             var item = data[pos];
57109
57110             while (pos > 0) {
57111                 var parent = (pos - 1) >> 1;
57112                 var current = data[parent];
57113                 if (compare(item, current) >= 0) { break; }
57114                 data[pos] = current;
57115                 pos = parent;
57116             }
57117
57118             data[pos] = item;
57119         },
57120
57121         _down: function (pos) {
57122             var this$1 = this;
57123
57124             var data = this.data;
57125             var compare = this.compare;
57126             var halfLength = this.length >> 1;
57127             var item = data[pos];
57128
57129             while (pos < halfLength) {
57130                 var left = (pos << 1) + 1;
57131                 var right = left + 1;
57132                 var best = data[left];
57133
57134                 if (right < this$1.length && compare(data[right], best) < 0) {
57135                     left = right;
57136                     best = data[right];
57137                 }
57138                 if (compare(best, item) >= 0) { break; }
57139
57140                 data[pos] = best;
57141                 pos = left;
57142             }
57143
57144             data[pos] = item;
57145         }
57146     };
57147     tinyqueue.default = default_1;
57148
57149     var max = Math.max;
57150     var min = Math.min;
57151
57152     var contourId = 0;
57153
57154
57155     function processPolygon(contourOrHole, isSubject, depth, Q, bbox, isExteriorRing) {
57156       var i, len, s1, s2, e1, e2;
57157       for (i = 0, len = contourOrHole.length - 1; i < len; i++) {
57158         s1 = contourOrHole[i];
57159         s2 = contourOrHole[i + 1];
57160         e1 = new SweepEvent(s1, false, undefined, isSubject);
57161         e2 = new SweepEvent(s2, false, e1,        isSubject);
57162         e1.otherEvent = e2;
57163
57164         if (s1[0] === s2[0] && s1[1] === s2[1]) {
57165           continue; // skip collapsed edges, or it breaks
57166         }
57167
57168         e1.contourId = e2.contourId = depth;
57169         if (!isExteriorRing) {
57170           e1.isExteriorRing = false;
57171           e2.isExteriorRing = false;
57172         }
57173         if (compareEvents(e1, e2) > 0) {
57174           e2.left = true;
57175         } else {
57176           e1.left = true;
57177         }
57178
57179         var x = s1[0], y = s1[1];
57180         bbox[0] = min(bbox[0], x);
57181         bbox[1] = min(bbox[1], y);
57182         bbox[2] = max(bbox[2], x);
57183         bbox[3] = max(bbox[3], y);
57184
57185         // Pushing it so the queue is sorted from left to right,
57186         // with object on the left having the highest priority.
57187         Q.push(e1);
57188         Q.push(e2);
57189       }
57190     }
57191
57192
57193     function fillQueue(subject, clipping, sbbox, cbbox, operation) {
57194       var eventQueue = new tinyqueue(null, compareEvents);
57195       var polygonSet, isExteriorRing, i, ii, j, jj; //, k, kk;
57196
57197       for (i = 0, ii = subject.length; i < ii; i++) {
57198         polygonSet = subject[i];
57199         for (j = 0, jj = polygonSet.length; j < jj; j++) {
57200           isExteriorRing = j === 0;
57201           if (isExteriorRing) { contourId++; }
57202           processPolygon(polygonSet[j], true, contourId, eventQueue, sbbox, isExteriorRing);
57203         }
57204       }
57205
57206       for (i = 0, ii = clipping.length; i < ii; i++) {
57207         polygonSet = clipping[i];
57208         for (j = 0, jj = polygonSet.length; j < jj; j++) {
57209           isExteriorRing = j === 0;
57210           if (operation === DIFFERENCE) { isExteriorRing = false; }
57211           if (isExteriorRing) { contourId++; }
57212           processPolygon(polygonSet[j], false, contourId, eventQueue, cbbox, isExteriorRing);
57213         }
57214       }
57215
57216       return eventQueue;
57217     }
57218
57219     var EMPTY = [];
57220
57221
57222     function trivialOperation(subject, clipping, operation) {
57223       var result = null;
57224       if (subject.length * clipping.length === 0) {
57225         if        (operation === INTERSECTION) {
57226           result = EMPTY;
57227         } else if (operation === DIFFERENCE) {
57228           result = subject;
57229         } else if (operation === UNION ||
57230                    operation === XOR) {
57231           result = (subject.length === 0) ? clipping : subject;
57232         }
57233       }
57234       return result;
57235     }
57236
57237
57238     function compareBBoxes(subject, clipping, sbbox, cbbox, operation) {
57239       var result = null;
57240       if (sbbox[0] > cbbox[2] ||
57241           cbbox[0] > sbbox[2] ||
57242           sbbox[1] > cbbox[3] ||
57243           cbbox[1] > sbbox[3]) {
57244         if        (operation === INTERSECTION) {
57245           result = EMPTY;
57246         } else if (operation === DIFFERENCE) {
57247           result = subject;
57248         } else if (operation === UNION ||
57249                    operation === XOR) {
57250           result = subject.concat(clipping);
57251         }
57252       }
57253       return result;
57254     }
57255
57256
57257     function boolean(subject, clipping, operation) {
57258       if (typeof subject[0][0][0] === 'number') {
57259         subject = [subject];
57260       }
57261       if (typeof clipping[0][0][0] === 'number') {
57262         clipping = [clipping];
57263       }
57264       var trivial = trivialOperation(subject, clipping, operation);
57265       if (trivial) {
57266         return trivial === EMPTY ? null : trivial;
57267       }
57268       var sbbox = [Infinity, Infinity, -Infinity, -Infinity];
57269       var cbbox = [Infinity, Infinity, -Infinity, -Infinity];
57270
57271       //console.time('fill queue');
57272       var eventQueue = fillQueue(subject, clipping, sbbox, cbbox, operation);
57273       //console.timeEnd('fill queue');
57274
57275       trivial = compareBBoxes(subject, clipping, sbbox, cbbox, operation);
57276       if (trivial) {
57277         return trivial === EMPTY ? null : trivial;
57278       }
57279       //console.time('subdivide edges');
57280       var sortedEvents = subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation);
57281       //console.timeEnd('subdivide edges');
57282
57283       //console.time('connect vertices');
57284       var result = connectEdges(sortedEvents, operation);
57285       //console.timeEnd('connect vertices');
57286       return result;
57287     }
57288
57289     function union (subject, clipping) {
57290       return boolean(subject, clipping, UNION);
57291     }
57292
57293     function diff (subject, clipping) {
57294       return boolean(subject, clipping, DIFFERENCE);
57295     }
57296
57297     function xor (subject, clipping){
57298       return boolean(subject, clipping, XOR);
57299     }
57300
57301     function intersection$1 (subject, clipping) {
57302       return boolean(subject, clipping, INTERSECTION);
57303     }
57304
57305     /**
57306      * @enum {Number}
57307      */
57308     var operations = { UNION: UNION, DIFFERENCE: DIFFERENCE, INTERSECTION: INTERSECTION, XOR: XOR };
57309
57310     exports.union = union;
57311     exports.diff = diff;
57312     exports.xor = xor;
57313     exports.intersection = intersection$1;
57314     exports.operations = operations;
57315
57316     Object.defineProperty(exports, '__esModule', { value: true });
57317
57318   })));
57319
57320   });
57321
57322   var martinez = unwrapExports(martinez_umd);
57323
57324   var read$6 = function (buffer, offset, isLE, mLen, nBytes) {
57325     var e, m;
57326     var eLen = (nBytes * 8) - mLen - 1;
57327     var eMax = (1 << eLen) - 1;
57328     var eBias = eMax >> 1;
57329     var nBits = -7;
57330     var i = isLE ? (nBytes - 1) : 0;
57331     var d = isLE ? -1 : 1;
57332     var s = buffer[offset + i];
57333
57334     i += d;
57335
57336     e = s & ((1 << (-nBits)) - 1);
57337     s >>= (-nBits);
57338     nBits += eLen;
57339     for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
57340
57341     m = e & ((1 << (-nBits)) - 1);
57342     e >>= (-nBits);
57343     nBits += mLen;
57344     for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
57345
57346     if (e === 0) {
57347       e = 1 - eBias;
57348     } else if (e === eMax) {
57349       return m ? NaN : ((s ? -1 : 1) * Infinity)
57350     } else {
57351       m = m + Math.pow(2, mLen);
57352       e = e - eBias;
57353     }
57354     return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
57355   };
57356
57357   var write$6 = function (buffer, value, offset, isLE, mLen, nBytes) {
57358     var e, m, c;
57359     var eLen = (nBytes * 8) - mLen - 1;
57360     var eMax = (1 << eLen) - 1;
57361     var eBias = eMax >> 1;
57362     var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);
57363     var i = isLE ? 0 : (nBytes - 1);
57364     var d = isLE ? 1 : -1;
57365     var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
57366
57367     value = Math.abs(value);
57368
57369     if (isNaN(value) || value === Infinity) {
57370       m = isNaN(value) ? 1 : 0;
57371       e = eMax;
57372     } else {
57373       e = Math.floor(Math.log(value) / Math.LN2);
57374       if (value * (c = Math.pow(2, -e)) < 1) {
57375         e--;
57376         c *= 2;
57377       }
57378       if (e + eBias >= 1) {
57379         value += rt / c;
57380       } else {
57381         value += rt * Math.pow(2, 1 - eBias);
57382       }
57383       if (value * c >= 2) {
57384         e++;
57385         c /= 2;
57386       }
57387
57388       if (e + eBias >= eMax) {
57389         m = 0;
57390         e = eMax;
57391       } else if (e + eBias >= 1) {
57392         m = ((value * c) - 1) * Math.pow(2, mLen);
57393         e = e + eBias;
57394       } else {
57395         m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
57396         e = 0;
57397       }
57398     }
57399
57400     for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
57401
57402     e = (e << mLen) | m;
57403     eLen += mLen;
57404     for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
57405
57406     buffer[offset + i - d] |= s * 128;
57407   };
57408
57409   var ieee754 = {
57410         read: read$6,
57411         write: write$6
57412   };
57413
57414   var pbf = Pbf;
57415
57416
57417
57418   function Pbf(buf) {
57419       this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
57420       this.pos = 0;
57421       this.type = 0;
57422       this.length = this.buf.length;
57423   }
57424
57425   Pbf.Varint  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
57426   Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
57427   Pbf.Bytes   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
57428   Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
57429
57430   var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
57431       SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
57432
57433   Pbf.prototype = {
57434
57435       destroy: function() {
57436           this.buf = null;
57437       },
57438
57439       // === READING =================================================================
57440
57441       readFields: function(readField, result, end) {
57442           end = end || this.length;
57443
57444           while (this.pos < end) {
57445               var val = this.readVarint(),
57446                   tag = val >> 3,
57447                   startPos = this.pos;
57448
57449               this.type = val & 0x7;
57450               readField(tag, result, this);
57451
57452               if (this.pos === startPos) this.skip(val);
57453           }
57454           return result;
57455       },
57456
57457       readMessage: function(readField, result) {
57458           return this.readFields(readField, result, this.readVarint() + this.pos);
57459       },
57460
57461       readFixed32: function() {
57462           var val = readUInt32(this.buf, this.pos);
57463           this.pos += 4;
57464           return val;
57465       },
57466
57467       readSFixed32: function() {
57468           var val = readInt32(this.buf, this.pos);
57469           this.pos += 4;
57470           return val;
57471       },
57472
57473       // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
57474
57475       readFixed64: function() {
57476           var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
57477           this.pos += 8;
57478           return val;
57479       },
57480
57481       readSFixed64: function() {
57482           var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
57483           this.pos += 8;
57484           return val;
57485       },
57486
57487       readFloat: function() {
57488           var val = ieee754.read(this.buf, this.pos, true, 23, 4);
57489           this.pos += 4;
57490           return val;
57491       },
57492
57493       readDouble: function() {
57494           var val = ieee754.read(this.buf, this.pos, true, 52, 8);
57495           this.pos += 8;
57496           return val;
57497       },
57498
57499       readVarint: function(isSigned) {
57500           var buf = this.buf,
57501               val, b;
57502
57503           b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;
57504           b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;
57505           b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
57506           b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
57507           b = buf[this.pos];   val |= (b & 0x0f) << 28;
57508
57509           return readVarintRemainder(val, isSigned, this);
57510       },
57511
57512       readVarint64: function() { // for compatibility with v2.0.1
57513           return this.readVarint(true);
57514       },
57515
57516       readSVarint: function() {
57517           var num = this.readVarint();
57518           return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
57519       },
57520
57521       readBoolean: function() {
57522           return Boolean(this.readVarint());
57523       },
57524
57525       readString: function() {
57526           var end = this.readVarint() + this.pos,
57527               str = readUtf8(this.buf, this.pos, end);
57528           this.pos = end;
57529           return str;
57530       },
57531
57532       readBytes: function() {
57533           var end = this.readVarint() + this.pos,
57534               buffer = this.buf.subarray(this.pos, end);
57535           this.pos = end;
57536           return buffer;
57537       },
57538
57539       // verbose for performance reasons; doesn't affect gzipped size
57540
57541       readPackedVarint: function(arr, isSigned) {
57542           var end = readPackedEnd(this);
57543           arr = arr || [];
57544           while (this.pos < end) arr.push(this.readVarint(isSigned));
57545           return arr;
57546       },
57547       readPackedSVarint: function(arr) {
57548           var end = readPackedEnd(this);
57549           arr = arr || [];
57550           while (this.pos < end) arr.push(this.readSVarint());
57551           return arr;
57552       },
57553       readPackedBoolean: function(arr) {
57554           var end = readPackedEnd(this);
57555           arr = arr || [];
57556           while (this.pos < end) arr.push(this.readBoolean());
57557           return arr;
57558       },
57559       readPackedFloat: function(arr) {
57560           var end = readPackedEnd(this);
57561           arr = arr || [];
57562           while (this.pos < end) arr.push(this.readFloat());
57563           return arr;
57564       },
57565       readPackedDouble: function(arr) {
57566           var end = readPackedEnd(this);
57567           arr = arr || [];
57568           while (this.pos < end) arr.push(this.readDouble());
57569           return arr;
57570       },
57571       readPackedFixed32: function(arr) {
57572           var end = readPackedEnd(this);
57573           arr = arr || [];
57574           while (this.pos < end) arr.push(this.readFixed32());
57575           return arr;
57576       },
57577       readPackedSFixed32: function(arr) {
57578           var end = readPackedEnd(this);
57579           arr = arr || [];
57580           while (this.pos < end) arr.push(this.readSFixed32());
57581           return arr;
57582       },
57583       readPackedFixed64: function(arr) {
57584           var end = readPackedEnd(this);
57585           arr = arr || [];
57586           while (this.pos < end) arr.push(this.readFixed64());
57587           return arr;
57588       },
57589       readPackedSFixed64: function(arr) {
57590           var end = readPackedEnd(this);
57591           arr = arr || [];
57592           while (this.pos < end) arr.push(this.readSFixed64());
57593           return arr;
57594       },
57595
57596       skip: function(val) {
57597           var type = val & 0x7;
57598           if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
57599           else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
57600           else if (type === Pbf.Fixed32) this.pos += 4;
57601           else if (type === Pbf.Fixed64) this.pos += 8;
57602           else throw new Error('Unimplemented type: ' + type);
57603       },
57604
57605       // === WRITING =================================================================
57606
57607       writeTag: function(tag, type) {
57608           this.writeVarint((tag << 3) | type);
57609       },
57610
57611       realloc: function(min) {
57612           var length = this.length || 16;
57613
57614           while (length < this.pos + min) length *= 2;
57615
57616           if (length !== this.length) {
57617               var buf = new Uint8Array(length);
57618               buf.set(this.buf);
57619               this.buf = buf;
57620               this.length = length;
57621           }
57622       },
57623
57624       finish: function() {
57625           this.length = this.pos;
57626           this.pos = 0;
57627           return this.buf.subarray(0, this.length);
57628       },
57629
57630       writeFixed32: function(val) {
57631           this.realloc(4);
57632           writeInt32(this.buf, val, this.pos);
57633           this.pos += 4;
57634       },
57635
57636       writeSFixed32: function(val) {
57637           this.realloc(4);
57638           writeInt32(this.buf, val, this.pos);
57639           this.pos += 4;
57640       },
57641
57642       writeFixed64: function(val) {
57643           this.realloc(8);
57644           writeInt32(this.buf, val & -1, this.pos);
57645           writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
57646           this.pos += 8;
57647       },
57648
57649       writeSFixed64: function(val) {
57650           this.realloc(8);
57651           writeInt32(this.buf, val & -1, this.pos);
57652           writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
57653           this.pos += 8;
57654       },
57655
57656       writeVarint: function(val) {
57657           val = +val || 0;
57658
57659           if (val > 0xfffffff || val < 0) {
57660               writeBigVarint(val, this);
57661               return;
57662           }
57663
57664           this.realloc(4);
57665
57666           this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
57667           this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
57668           this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
57669           this.buf[this.pos++] =   (val >>> 7) & 0x7f;
57670       },
57671
57672       writeSVarint: function(val) {
57673           this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
57674       },
57675
57676       writeBoolean: function(val) {
57677           this.writeVarint(Boolean(val));
57678       },
57679
57680       writeString: function(str) {
57681           str = String(str);
57682           this.realloc(str.length * 4);
57683
57684           this.pos++; // reserve 1 byte for short string length
57685
57686           var startPos = this.pos;
57687           // write the string directly to the buffer and see how much was written
57688           this.pos = writeUtf8(this.buf, str, this.pos);
57689           var len = this.pos - startPos;
57690
57691           if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
57692
57693           // finally, write the message length in the reserved place and restore the position
57694           this.pos = startPos - 1;
57695           this.writeVarint(len);
57696           this.pos += len;
57697       },
57698
57699       writeFloat: function(val) {
57700           this.realloc(4);
57701           ieee754.write(this.buf, val, this.pos, true, 23, 4);
57702           this.pos += 4;
57703       },
57704
57705       writeDouble: function(val) {
57706           this.realloc(8);
57707           ieee754.write(this.buf, val, this.pos, true, 52, 8);
57708           this.pos += 8;
57709       },
57710
57711       writeBytes: function(buffer) {
57712           var len = buffer.length;
57713           this.writeVarint(len);
57714           this.realloc(len);
57715           for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
57716       },
57717
57718       writeRawMessage: function(fn, obj) {
57719           this.pos++; // reserve 1 byte for short message length
57720
57721           // write the message directly to the buffer and see how much was written
57722           var startPos = this.pos;
57723           fn(obj, this);
57724           var len = this.pos - startPos;
57725
57726           if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
57727
57728           // finally, write the message length in the reserved place and restore the position
57729           this.pos = startPos - 1;
57730           this.writeVarint(len);
57731           this.pos += len;
57732       },
57733
57734       writeMessage: function(tag, fn, obj) {
57735           this.writeTag(tag, Pbf.Bytes);
57736           this.writeRawMessage(fn, obj);
57737       },
57738
57739       writePackedVarint:   function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr);   },
57740       writePackedSVarint:  function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr);  },
57741       writePackedBoolean:  function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr);  },
57742       writePackedFloat:    function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr);    },
57743       writePackedDouble:   function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr);   },
57744       writePackedFixed32:  function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr);  },
57745       writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); },
57746       writePackedFixed64:  function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr);  },
57747       writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); },
57748
57749       writeBytesField: function(tag, buffer) {
57750           this.writeTag(tag, Pbf.Bytes);
57751           this.writeBytes(buffer);
57752       },
57753       writeFixed32Field: function(tag, val) {
57754           this.writeTag(tag, Pbf.Fixed32);
57755           this.writeFixed32(val);
57756       },
57757       writeSFixed32Field: function(tag, val) {
57758           this.writeTag(tag, Pbf.Fixed32);
57759           this.writeSFixed32(val);
57760       },
57761       writeFixed64Field: function(tag, val) {
57762           this.writeTag(tag, Pbf.Fixed64);
57763           this.writeFixed64(val);
57764       },
57765       writeSFixed64Field: function(tag, val) {
57766           this.writeTag(tag, Pbf.Fixed64);
57767           this.writeSFixed64(val);
57768       },
57769       writeVarintField: function(tag, val) {
57770           this.writeTag(tag, Pbf.Varint);
57771           this.writeVarint(val);
57772       },
57773       writeSVarintField: function(tag, val) {
57774           this.writeTag(tag, Pbf.Varint);
57775           this.writeSVarint(val);
57776       },
57777       writeStringField: function(tag, str) {
57778           this.writeTag(tag, Pbf.Bytes);
57779           this.writeString(str);
57780       },
57781       writeFloatField: function(tag, val) {
57782           this.writeTag(tag, Pbf.Fixed32);
57783           this.writeFloat(val);
57784       },
57785       writeDoubleField: function(tag, val) {
57786           this.writeTag(tag, Pbf.Fixed64);
57787           this.writeDouble(val);
57788       },
57789       writeBooleanField: function(tag, val) {
57790           this.writeVarintField(tag, Boolean(val));
57791       }
57792   };
57793
57794   function readVarintRemainder(l, s, p) {
57795       var buf = p.buf,
57796           h, b;
57797
57798       b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);
57799       b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);
57800       b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
57801       b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
57802       b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
57803       b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
57804
57805       throw new Error('Expected varint not more than 10 bytes');
57806   }
57807
57808   function readPackedEnd(pbf) {
57809       return pbf.type === Pbf.Bytes ?
57810           pbf.readVarint() + pbf.pos : pbf.pos + 1;
57811   }
57812
57813   function toNum(low, high, isSigned) {
57814       if (isSigned) {
57815           return high * 0x100000000 + (low >>> 0);
57816       }
57817
57818       return ((high >>> 0) * 0x100000000) + (low >>> 0);
57819   }
57820
57821   function writeBigVarint(val, pbf) {
57822       var low, high;
57823
57824       if (val >= 0) {
57825           low  = (val % 0x100000000) | 0;
57826           high = (val / 0x100000000) | 0;
57827       } else {
57828           low  = ~(-val % 0x100000000);
57829           high = ~(-val / 0x100000000);
57830
57831           if (low ^ 0xffffffff) {
57832               low = (low + 1) | 0;
57833           } else {
57834               low = 0;
57835               high = (high + 1) | 0;
57836           }
57837       }
57838
57839       if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
57840           throw new Error('Given varint doesn\'t fit into 10 bytes');
57841       }
57842
57843       pbf.realloc(10);
57844
57845       writeBigVarintLow(low, high, pbf);
57846       writeBigVarintHigh(high, pbf);
57847   }
57848
57849   function writeBigVarintLow(low, high, pbf) {
57850       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
57851       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
57852       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
57853       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
57854       pbf.buf[pbf.pos]   = low & 0x7f;
57855   }
57856
57857   function writeBigVarintHigh(high, pbf) {
57858       var lsb = (high & 0x07) << 4;
57859
57860       pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
57861       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
57862       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
57863       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
57864       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
57865       pbf.buf[pbf.pos++]  = high & 0x7f;
57866   }
57867
57868   function makeRoomForExtraLength(startPos, len, pbf) {
57869       var extraLen =
57870           len <= 0x3fff ? 1 :
57871           len <= 0x1fffff ? 2 :
57872           len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7));
57873
57874       // if 1 byte isn't enough for encoding message length, shift the data to the right
57875       pbf.realloc(extraLen);
57876       for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
57877   }
57878
57879   function writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }
57880   function writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }
57881   function writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }
57882   function writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }
57883   function writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }
57884   function writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }
57885   function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
57886   function writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }
57887   function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
57888
57889   // Buffer code below from https://github.com/feross/buffer, MIT-licensed
57890
57891   function readUInt32(buf, pos) {
57892       return ((buf[pos]) |
57893           (buf[pos + 1] << 8) |
57894           (buf[pos + 2] << 16)) +
57895           (buf[pos + 3] * 0x1000000);
57896   }
57897
57898   function writeInt32(buf, val, pos) {
57899       buf[pos] = val;
57900       buf[pos + 1] = (val >>> 8);
57901       buf[pos + 2] = (val >>> 16);
57902       buf[pos + 3] = (val >>> 24);
57903   }
57904
57905   function readInt32(buf, pos) {
57906       return ((buf[pos]) |
57907           (buf[pos + 1] << 8) |
57908           (buf[pos + 2] << 16)) +
57909           (buf[pos + 3] << 24);
57910   }
57911
57912   function readUtf8(buf, pos, end) {
57913       var str = '';
57914       var i = pos;
57915
57916       while (i < end) {
57917           var b0 = buf[i];
57918           var c = null; // codepoint
57919           var bytesPerSequence =
57920               b0 > 0xEF ? 4 :
57921               b0 > 0xDF ? 3 :
57922               b0 > 0xBF ? 2 : 1;
57923
57924           if (i + bytesPerSequence > end) break;
57925
57926           var b1, b2, b3;
57927
57928           if (bytesPerSequence === 1) {
57929               if (b0 < 0x80) {
57930                   c = b0;
57931               }
57932           } else if (bytesPerSequence === 2) {
57933               b1 = buf[i + 1];
57934               if ((b1 & 0xC0) === 0x80) {
57935                   c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
57936                   if (c <= 0x7F) {
57937                       c = null;
57938                   }
57939               }
57940           } else if (bytesPerSequence === 3) {
57941               b1 = buf[i + 1];
57942               b2 = buf[i + 2];
57943               if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
57944                   c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
57945                   if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
57946                       c = null;
57947                   }
57948               }
57949           } else if (bytesPerSequence === 4) {
57950               b1 = buf[i + 1];
57951               b2 = buf[i + 2];
57952               b3 = buf[i + 3];
57953               if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
57954                   c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
57955                   if (c <= 0xFFFF || c >= 0x110000) {
57956                       c = null;
57957                   }
57958               }
57959           }
57960
57961           if (c === null) {
57962               c = 0xFFFD;
57963               bytesPerSequence = 1;
57964
57965           } else if (c > 0xFFFF) {
57966               c -= 0x10000;
57967               str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
57968               c = 0xDC00 | c & 0x3FF;
57969           }
57970
57971           str += String.fromCharCode(c);
57972           i += bytesPerSequence;
57973       }
57974
57975       return str;
57976   }
57977
57978   function writeUtf8(buf, str, pos) {
57979       for (var i = 0, c, lead; i < str.length; i++) {
57980           c = str.charCodeAt(i); // code point
57981
57982           if (c > 0xD7FF && c < 0xE000) {
57983               if (lead) {
57984                   if (c < 0xDC00) {
57985                       buf[pos++] = 0xEF;
57986                       buf[pos++] = 0xBF;
57987                       buf[pos++] = 0xBD;
57988                       lead = c;
57989                       continue;
57990                   } else {
57991                       c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
57992                       lead = null;
57993                   }
57994               } else {
57995                   if (c > 0xDBFF || (i + 1 === str.length)) {
57996                       buf[pos++] = 0xEF;
57997                       buf[pos++] = 0xBF;
57998                       buf[pos++] = 0xBD;
57999                   } else {
58000                       lead = c;
58001                   }
58002                   continue;
58003               }
58004           } else if (lead) {
58005               buf[pos++] = 0xEF;
58006               buf[pos++] = 0xBF;
58007               buf[pos++] = 0xBD;
58008               lead = null;
58009           }
58010
58011           if (c < 0x80) {
58012               buf[pos++] = c;
58013           } else {
58014               if (c < 0x800) {
58015                   buf[pos++] = c >> 0x6 | 0xC0;
58016               } else {
58017                   if (c < 0x10000) {
58018                       buf[pos++] = c >> 0xC | 0xE0;
58019                   } else {
58020                       buf[pos++] = c >> 0x12 | 0xF0;
58021                       buf[pos++] = c >> 0xC & 0x3F | 0x80;
58022                   }
58023                   buf[pos++] = c >> 0x6 & 0x3F | 0x80;
58024               }
58025               buf[pos++] = c & 0x3F | 0x80;
58026           }
58027       }
58028       return pos;
58029   }
58030
58031   var pointGeometry = Point;
58032
58033   /**
58034    * A standalone point geometry with useful accessor, comparison, and
58035    * modification methods.
58036    *
58037    * @class Point
58038    * @param {Number} x the x-coordinate. this could be longitude or screen
58039    * pixels, or any other sort of unit.
58040    * @param {Number} y the y-coordinate. this could be latitude or screen
58041    * pixels, or any other sort of unit.
58042    * @example
58043    * var point = new Point(-77, 38);
58044    */
58045   function Point(x, y) {
58046       this.x = x;
58047       this.y = y;
58048   }
58049
58050   Point.prototype = {
58051
58052       /**
58053        * Clone this point, returning a new point that can be modified
58054        * without affecting the old one.
58055        * @return {Point} the clone
58056        */
58057       clone: function() { return new Point(this.x, this.y); },
58058
58059       /**
58060        * Add this point's x & y coordinates to another point,
58061        * yielding a new point.
58062        * @param {Point} p the other point
58063        * @return {Point} output point
58064        */
58065       add:     function(p) { return this.clone()._add(p); },
58066
58067       /**
58068        * Subtract this point's x & y coordinates to from point,
58069        * yielding a new point.
58070        * @param {Point} p the other point
58071        * @return {Point} output point
58072        */
58073       sub:     function(p) { return this.clone()._sub(p); },
58074
58075       /**
58076        * Multiply this point's x & y coordinates by point,
58077        * yielding a new point.
58078        * @param {Point} p the other point
58079        * @return {Point} output point
58080        */
58081       multByPoint:    function(p) { return this.clone()._multByPoint(p); },
58082
58083       /**
58084        * Divide this point's x & y coordinates by point,
58085        * yielding a new point.
58086        * @param {Point} p the other point
58087        * @return {Point} output point
58088        */
58089       divByPoint:     function(p) { return this.clone()._divByPoint(p); },
58090
58091       /**
58092        * Multiply this point's x & y coordinates by a factor,
58093        * yielding a new point.
58094        * @param {Point} k factor
58095        * @return {Point} output point
58096        */
58097       mult:    function(k) { return this.clone()._mult(k); },
58098
58099       /**
58100        * Divide this point's x & y coordinates by a factor,
58101        * yielding a new point.
58102        * @param {Point} k factor
58103        * @return {Point} output point
58104        */
58105       div:     function(k) { return this.clone()._div(k); },
58106
58107       /**
58108        * Rotate this point around the 0, 0 origin by an angle a,
58109        * given in radians
58110        * @param {Number} a angle to rotate around, in radians
58111        * @return {Point} output point
58112        */
58113       rotate:  function(a) { return this.clone()._rotate(a); },
58114
58115       /**
58116        * Rotate this point around p point by an angle a,
58117        * given in radians
58118        * @param {Number} a angle to rotate around, in radians
58119        * @param {Point} p Point to rotate around
58120        * @return {Point} output point
58121        */
58122       rotateAround:  function(a,p) { return this.clone()._rotateAround(a,p); },
58123
58124       /**
58125        * Multiply this point by a 4x1 transformation matrix
58126        * @param {Array<Number>} m transformation matrix
58127        * @return {Point} output point
58128        */
58129       matMult: function(m) { return this.clone()._matMult(m); },
58130
58131       /**
58132        * Calculate this point but as a unit vector from 0, 0, meaning
58133        * that the distance from the resulting point to the 0, 0
58134        * coordinate will be equal to 1 and the angle from the resulting
58135        * point to the 0, 0 coordinate will be the same as before.
58136        * @return {Point} unit vector point
58137        */
58138       unit:    function() { return this.clone()._unit(); },
58139
58140       /**
58141        * Compute a perpendicular point, where the new y coordinate
58142        * is the old x coordinate and the new x coordinate is the old y
58143        * coordinate multiplied by -1
58144        * @return {Point} perpendicular point
58145        */
58146       perp:    function() { return this.clone()._perp(); },
58147
58148       /**
58149        * Return a version of this point with the x & y coordinates
58150        * rounded to integers.
58151        * @return {Point} rounded point
58152        */
58153       round:   function() { return this.clone()._round(); },
58154
58155       /**
58156        * Return the magitude of this point: this is the Euclidean
58157        * distance from the 0, 0 coordinate to this point's x and y
58158        * coordinates.
58159        * @return {Number} magnitude
58160        */
58161       mag: function() {
58162           return Math.sqrt(this.x * this.x + this.y * this.y);
58163       },
58164
58165       /**
58166        * Judge whether this point is equal to another point, returning
58167        * true or false.
58168        * @param {Point} other the other point
58169        * @return {boolean} whether the points are equal
58170        */
58171       equals: function(other) {
58172           return this.x === other.x &&
58173                  this.y === other.y;
58174       },
58175
58176       /**
58177        * Calculate the distance from this point to another point
58178        * @param {Point} p the other point
58179        * @return {Number} distance
58180        */
58181       dist: function(p) {
58182           return Math.sqrt(this.distSqr(p));
58183       },
58184
58185       /**
58186        * Calculate the distance from this point to another point,
58187        * without the square root step. Useful if you're comparing
58188        * relative distances.
58189        * @param {Point} p the other point
58190        * @return {Number} distance
58191        */
58192       distSqr: function(p) {
58193           var dx = p.x - this.x,
58194               dy = p.y - this.y;
58195           return dx * dx + dy * dy;
58196       },
58197
58198       /**
58199        * Get the angle from the 0, 0 coordinate to this point, in radians
58200        * coordinates.
58201        * @return {Number} angle
58202        */
58203       angle: function() {
58204           return Math.atan2(this.y, this.x);
58205       },
58206
58207       /**
58208        * Get the angle from this point to another point, in radians
58209        * @param {Point} b the other point
58210        * @return {Number} angle
58211        */
58212       angleTo: function(b) {
58213           return Math.atan2(this.y - b.y, this.x - b.x);
58214       },
58215
58216       /**
58217        * Get the angle between this point and another point, in radians
58218        * @param {Point} b the other point
58219        * @return {Number} angle
58220        */
58221       angleWith: function(b) {
58222           return this.angleWithSep(b.x, b.y);
58223       },
58224
58225       /*
58226        * Find the angle of the two vectors, solving the formula for
58227        * the cross product a x b = |a||b|sin(θ) for θ.
58228        * @param {Number} x the x-coordinate
58229        * @param {Number} y the y-coordinate
58230        * @return {Number} the angle in radians
58231        */
58232       angleWithSep: function(x, y) {
58233           return Math.atan2(
58234               this.x * y - this.y * x,
58235               this.x * x + this.y * y);
58236       },
58237
58238       _matMult: function(m) {
58239           var x = m[0] * this.x + m[1] * this.y,
58240               y = m[2] * this.x + m[3] * this.y;
58241           this.x = x;
58242           this.y = y;
58243           return this;
58244       },
58245
58246       _add: function(p) {
58247           this.x += p.x;
58248           this.y += p.y;
58249           return this;
58250       },
58251
58252       _sub: function(p) {
58253           this.x -= p.x;
58254           this.y -= p.y;
58255           return this;
58256       },
58257
58258       _mult: function(k) {
58259           this.x *= k;
58260           this.y *= k;
58261           return this;
58262       },
58263
58264       _div: function(k) {
58265           this.x /= k;
58266           this.y /= k;
58267           return this;
58268       },
58269
58270       _multByPoint: function(p) {
58271           this.x *= p.x;
58272           this.y *= p.y;
58273           return this;
58274       },
58275
58276       _divByPoint: function(p) {
58277           this.x /= p.x;
58278           this.y /= p.y;
58279           return this;
58280       },
58281
58282       _unit: function() {
58283           this._div(this.mag());
58284           return this;
58285       },
58286
58287       _perp: function() {
58288           var y = this.y;
58289           this.y = this.x;
58290           this.x = -y;
58291           return this;
58292       },
58293
58294       _rotate: function(angle) {
58295           var cos = Math.cos(angle),
58296               sin = Math.sin(angle),
58297               x = cos * this.x - sin * this.y,
58298               y = sin * this.x + cos * this.y;
58299           this.x = x;
58300           this.y = y;
58301           return this;
58302       },
58303
58304       _rotateAround: function(angle, p) {
58305           var cos = Math.cos(angle),
58306               sin = Math.sin(angle),
58307               x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),
58308               y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);
58309           this.x = x;
58310           this.y = y;
58311           return this;
58312       },
58313
58314       _round: function() {
58315           this.x = Math.round(this.x);
58316           this.y = Math.round(this.y);
58317           return this;
58318       }
58319   };
58320
58321   /**
58322    * Construct a point from an array if necessary, otherwise if the input
58323    * is already a Point, or an unknown type, return it unchanged
58324    * @param {Array<Number>|Point|*} a any kind of input value
58325    * @return {Point} constructed point, or passed-through value.
58326    * @example
58327    * // this
58328    * var point = Point.convert([0, 1]);
58329    * // is equivalent to
58330    * var point = new Point(0, 1);
58331    */
58332   Point.convert = function (a) {
58333       if (a instanceof Point) {
58334           return a;
58335       }
58336       if (Array.isArray(a)) {
58337           return new Point(a[0], a[1]);
58338       }
58339       return a;
58340   };
58341
58342   var vectortilefeature = VectorTileFeature;
58343
58344   function VectorTileFeature(pbf, end, extent, keys, values) {
58345       // Public
58346       this.properties = {};
58347       this.extent = extent;
58348       this.type = 0;
58349
58350       // Private
58351       this._pbf = pbf;
58352       this._geometry = -1;
58353       this._keys = keys;
58354       this._values = values;
58355
58356       pbf.readFields(readFeature, this, end);
58357   }
58358
58359   function readFeature(tag, feature, pbf) {
58360       if (tag == 1) feature.id = pbf.readVarint();
58361       else if (tag == 2) readTag(pbf, feature);
58362       else if (tag == 3) feature.type = pbf.readVarint();
58363       else if (tag == 4) feature._geometry = pbf.pos;
58364   }
58365
58366   function readTag(pbf, feature) {
58367       var end = pbf.readVarint() + pbf.pos;
58368
58369       while (pbf.pos < end) {
58370           var key = feature._keys[pbf.readVarint()],
58371               value = feature._values[pbf.readVarint()];
58372           feature.properties[key] = value;
58373       }
58374   }
58375
58376   VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon'];
58377
58378   VectorTileFeature.prototype.loadGeometry = function() {
58379       var pbf = this._pbf;
58380       pbf.pos = this._geometry;
58381
58382       var end = pbf.readVarint() + pbf.pos,
58383           cmd = 1,
58384           length = 0,
58385           x = 0,
58386           y = 0,
58387           lines = [],
58388           line;
58389
58390       while (pbf.pos < end) {
58391           if (length <= 0) {
58392               var cmdLen = pbf.readVarint();
58393               cmd = cmdLen & 0x7;
58394               length = cmdLen >> 3;
58395           }
58396
58397           length--;
58398
58399           if (cmd === 1 || cmd === 2) {
58400               x += pbf.readSVarint();
58401               y += pbf.readSVarint();
58402
58403               if (cmd === 1) { // moveTo
58404                   if (line) lines.push(line);
58405                   line = [];
58406               }
58407
58408               line.push(new pointGeometry(x, y));
58409
58410           } else if (cmd === 7) {
58411
58412               // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
58413               if (line) {
58414                   line.push(line[0].clone()); // closePolygon
58415               }
58416
58417           } else {
58418               throw new Error('unknown command ' + cmd);
58419           }
58420       }
58421
58422       if (line) lines.push(line);
58423
58424       return lines;
58425   };
58426
58427   VectorTileFeature.prototype.bbox = function() {
58428       var pbf = this._pbf;
58429       pbf.pos = this._geometry;
58430
58431       var end = pbf.readVarint() + pbf.pos,
58432           cmd = 1,
58433           length = 0,
58434           x = 0,
58435           y = 0,
58436           x1 = Infinity,
58437           x2 = -Infinity,
58438           y1 = Infinity,
58439           y2 = -Infinity;
58440
58441       while (pbf.pos < end) {
58442           if (length <= 0) {
58443               var cmdLen = pbf.readVarint();
58444               cmd = cmdLen & 0x7;
58445               length = cmdLen >> 3;
58446           }
58447
58448           length--;
58449
58450           if (cmd === 1 || cmd === 2) {
58451               x += pbf.readSVarint();
58452               y += pbf.readSVarint();
58453               if (x < x1) x1 = x;
58454               if (x > x2) x2 = x;
58455               if (y < y1) y1 = y;
58456               if (y > y2) y2 = y;
58457
58458           } else if (cmd !== 7) {
58459               throw new Error('unknown command ' + cmd);
58460           }
58461       }
58462
58463       return [x1, y1, x2, y2];
58464   };
58465
58466   VectorTileFeature.prototype.toGeoJSON = function(x, y, z) {
58467       var size = this.extent * Math.pow(2, z),
58468           x0 = this.extent * x,
58469           y0 = this.extent * y,
58470           coords = this.loadGeometry(),
58471           type = VectorTileFeature.types[this.type],
58472           i, j;
58473
58474       function project(line) {
58475           for (var j = 0; j < line.length; j++) {
58476               var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;
58477               line[j] = [
58478                   (p.x + x0) * 360 / size - 180,
58479                   360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90
58480               ];
58481           }
58482       }
58483
58484       switch (this.type) {
58485       case 1:
58486           var points = [];
58487           for (i = 0; i < coords.length; i++) {
58488               points[i] = coords[i][0];
58489           }
58490           coords = points;
58491           project(coords);
58492           break;
58493
58494       case 2:
58495           for (i = 0; i < coords.length; i++) {
58496               project(coords[i]);
58497           }
58498           break;
58499
58500       case 3:
58501           coords = classifyRings(coords);
58502           for (i = 0; i < coords.length; i++) {
58503               for (j = 0; j < coords[i].length; j++) {
58504                   project(coords[i][j]);
58505               }
58506           }
58507           break;
58508       }
58509
58510       if (coords.length === 1) {
58511           coords = coords[0];
58512       } else {
58513           type = 'Multi' + type;
58514       }
58515
58516       var result = {
58517           type: "Feature",
58518           geometry: {
58519               type: type,
58520               coordinates: coords
58521           },
58522           properties: this.properties
58523       };
58524
58525       if ('id' in this) {
58526           result.id = this.id;
58527       }
58528
58529       return result;
58530   };
58531
58532   // classifies an array of rings into polygons with outer rings and holes
58533
58534   function classifyRings(rings) {
58535       var len = rings.length;
58536
58537       if (len <= 1) return [rings];
58538
58539       var polygons = [],
58540           polygon,
58541           ccw;
58542
58543       for (var i = 0; i < len; i++) {
58544           var area = signedArea(rings[i]);
58545           if (area === 0) continue;
58546
58547           if (ccw === undefined) ccw = area < 0;
58548
58549           if (ccw === area < 0) {
58550               if (polygon) polygons.push(polygon);
58551               polygon = [rings[i]];
58552
58553           } else {
58554               polygon.push(rings[i]);
58555           }
58556       }
58557       if (polygon) polygons.push(polygon);
58558
58559       return polygons;
58560   }
58561
58562   function signedArea(ring) {
58563       var sum = 0;
58564       for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
58565           p1 = ring[i];
58566           p2 = ring[j];
58567           sum += (p2.x - p1.x) * (p1.y + p2.y);
58568       }
58569       return sum;
58570   }
58571
58572   var vectortilelayer = VectorTileLayer;
58573
58574   function VectorTileLayer(pbf, end) {
58575       // Public
58576       this.version = 1;
58577       this.name = null;
58578       this.extent = 4096;
58579       this.length = 0;
58580
58581       // Private
58582       this._pbf = pbf;
58583       this._keys = [];
58584       this._values = [];
58585       this._features = [];
58586
58587       pbf.readFields(readLayer, this, end);
58588
58589       this.length = this._features.length;
58590   }
58591
58592   function readLayer(tag, layer, pbf) {
58593       if (tag === 15) layer.version = pbf.readVarint();
58594       else if (tag === 1) layer.name = pbf.readString();
58595       else if (tag === 5) layer.extent = pbf.readVarint();
58596       else if (tag === 2) layer._features.push(pbf.pos);
58597       else if (tag === 3) layer._keys.push(pbf.readString());
58598       else if (tag === 4) layer._values.push(readValueMessage(pbf));
58599   }
58600
58601   function readValueMessage(pbf) {
58602       var value = null,
58603           end = pbf.readVarint() + pbf.pos;
58604
58605       while (pbf.pos < end) {
58606           var tag = pbf.readVarint() >> 3;
58607
58608           value = tag === 1 ? pbf.readString() :
58609               tag === 2 ? pbf.readFloat() :
58610               tag === 3 ? pbf.readDouble() :
58611               tag === 4 ? pbf.readVarint64() :
58612               tag === 5 ? pbf.readVarint() :
58613               tag === 6 ? pbf.readSVarint() :
58614               tag === 7 ? pbf.readBoolean() : null;
58615       }
58616
58617       return value;
58618   }
58619
58620   // return feature `i` from this layer as a `VectorTileFeature`
58621   VectorTileLayer.prototype.feature = function(i) {
58622       if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');
58623
58624       this._pbf.pos = this._features[i];
58625
58626       var end = this._pbf.readVarint() + this._pbf.pos;
58627       return new vectortilefeature(this._pbf, end, this.extent, this._keys, this._values);
58628   };
58629
58630   var vectortile = VectorTile;
58631
58632   function VectorTile(pbf, end) {
58633       this.layers = pbf.readFields(readTile, {}, end);
58634   }
58635
58636   function readTile(tag, layers, pbf) {
58637       if (tag === 3) {
58638           var layer = new vectortilelayer(pbf, pbf.readVarint() + pbf.pos);
58639           if (layer.length) layers[layer.name] = layer;
58640       }
58641   }
58642
58643   var VectorTile$1 = vectortile;
58644   var VectorTileFeature$1 = vectortilefeature;
58645   var VectorTileLayer$1 = vectortilelayer;
58646
58647   var vectorTile = {
58648         VectorTile: VectorTile$1,
58649         VectorTileFeature: VectorTileFeature$1,
58650         VectorTileLayer: VectorTileLayer$1
58651   };
58652
58653   var tiler$6 = utilTiler().tileSize(512).margin(1);
58654   var dispatch$7 = dispatch('loadedData');
58655   var _vtCache;
58656
58657
58658   function abortRequest$6(i) {
58659       i.abort();
58660   }
58661
58662
58663   function vtToGeoJSON(data, tile, mergeCache) {
58664       var vectorTile$1 = new vectorTile.VectorTile(new pbf(data.response));
58665       var layers = Object.keys(vectorTile$1.layers);
58666       if (!Array.isArray(layers)) { layers = [layers]; }
58667
58668       var features = [];
58669       layers.forEach(function(layerID) {
58670           var layer = vectorTile$1.layers[layerID];
58671           if (layer) {
58672               for (var i = 0; i < layer.length; i++) {
58673                   var feature = layer.feature(i).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
58674                   var geometry = feature.geometry;
58675
58676                   // Treat all Polygons as MultiPolygons
58677                   if (geometry.type === 'Polygon') {
58678                       geometry.type = 'MultiPolygon';
58679                       geometry.coordinates = [geometry.coordinates];
58680                   }
58681
58682                   // Clip to tile bounds
58683                   if (geometry.type === 'MultiPolygon') {
58684                       var isClipped = false;
58685                       var featureClip = turf_bboxClip(feature, tile.extent.rectangle());
58686                       if (!isEqual(feature.geometry, featureClip.geometry)) {
58687                           // feature = featureClip;
58688                           isClipped = true;
58689                       }
58690                       if (!feature.geometry.coordinates.length) continue;   // not actually on this tile
58691                       if (!feature.geometry.coordinates[0].length) continue;   // not actually on this tile
58692                   }
58693
58694                   // Generate some unique IDs and add some metadata
58695                   var featurehash = utilHashcode(fastJsonStableStringify(feature));
58696                   var propertyhash = utilHashcode(fastJsonStableStringify(feature.properties || {}));
58697                   feature.__layerID__ = layerID.replace(/[^_a-zA-Z0-9\-]/g, '_');
58698                   feature.__featurehash__ = featurehash;
58699                   feature.__propertyhash__ = propertyhash;
58700                   features.push(feature);
58701
58702                   // Clipped Polygons at same zoom with identical properties can get merged
58703                   if (isClipped && geometry.type === 'MultiPolygon') {
58704                       var merged = mergeCache[propertyhash];
58705                       if (merged && merged.length) {
58706                           var other = merged[0];
58707                           var coords = martinez.union(
58708                               feature.geometry.coordinates, other.geometry.coordinates
58709                           );
58710
58711                           if (!coords || !coords.length) {
58712                               continue;  // something failed in martinez union
58713                           }
58714
58715                           merged.push(feature);
58716                           for (var j = 0; j < merged.length; j++) {      // all these features get...
58717                               merged[j].geometry.coordinates = coords;   // same coords
58718                               merged[j].__featurehash__ = featurehash;   // same hash, so deduplication works
58719                           }
58720                       } else {
58721                           mergeCache[propertyhash] = [feature];
58722                       }
58723                   }
58724               }
58725           }
58726       });
58727
58728       return features;
58729   }
58730
58731
58732   function loadTile(source, tile) {
58733       if (source.loaded[tile.id] || source.inflight[tile.id]) return;
58734
58735       var url = source.template
58736           .replace('{x}', tile.xyz[0])
58737           .replace('{y}', tile.xyz[1])
58738           // TMS-flipped y coordinate
58739           .replace(/\{[t-]y\}/, Math.pow(2, tile.xyz[2]) - tile.xyz[1] - 1)
58740           .replace(/\{z(oom)?\}/, tile.xyz[2])
58741           .replace(/\{switch:([^}]+)\}/, function(s, r) {
58742               var subdomains = r.split(',');
58743               return subdomains[(tile.xyz[0] + tile.xyz[1]) % subdomains.length];
58744           });
58745
58746       source.inflight[tile.id] = request(url)
58747           .responseType('arraybuffer')
58748           .get(function(err, data) {
58749               source.loaded[tile.id] = [];
58750               delete source.inflight[tile.id];
58751               if (err || !data) return;
58752
58753               var z = tile.xyz[2];
58754               if (!source.canMerge[z]) {
58755                   source.canMerge[z] = {};  // initialize mergeCache
58756               }
58757
58758               source.loaded[tile.id] = vtToGeoJSON(data, tile, source.canMerge[z]);
58759               dispatch$7.call('loadedData');
58760           });
58761   }
58762
58763
58764   var serviceVectorTile = {
58765
58766       init: function() {
58767           if (!_vtCache) {
58768               this.reset();
58769           }
58770
58771           this.event = utilRebind(this, dispatch$7, 'on');
58772       },
58773
58774
58775       reset: function() {
58776           for (var sourceID in _vtCache) {
58777               var source = _vtCache[sourceID];
58778               if (source && source.inflight) {
58779                   forEach(source.inflight, abortRequest$6);
58780               }
58781           }
58782
58783           _vtCache = {};
58784       },
58785
58786
58787       addSource: function(sourceID, template) {
58788           _vtCache[sourceID] = { template: template, inflight: {}, loaded: {}, canMerge: {} };
58789           return _vtCache[sourceID];
58790       },
58791
58792
58793       data: function(sourceID, projection) {
58794           var source = _vtCache[sourceID];
58795           if (!source) return [];
58796
58797           var tiles = tiler$6.getTiles(projection);
58798           var seen = {};
58799           var results = [];
58800
58801           for (var i = 0; i < tiles.length; i++) {
58802               var features = source.loaded[tiles[i].id];
58803               if (!features || !features.length) continue;
58804
58805               for (var j = 0; j < features.length; j++) {
58806                   var feature = features[j];
58807                   var hash = feature.__featurehash__;
58808                   if (seen[hash]) continue;
58809                   seen[hash] = true;
58810
58811                   // return a shallow clone, because the hash may change
58812                   // later if this feature gets merged with another
58813                   results.push(clone(feature));
58814               }
58815           }
58816
58817           return results;
58818       },
58819
58820
58821       loadTiles: function(sourceID, template, projection) {
58822           var source = _vtCache[sourceID];
58823           if (!source) {
58824               source = this.addSource(sourceID, template);
58825           }
58826
58827           var tiles = tiler$6.getTiles(projection);
58828
58829           // abort inflight requests that are no longer needed
58830           forEach(source.inflight, function(v, k) {
58831               var wanted = find$1(tiles, function(tile) { return k === tile.id; });
58832
58833               if (!wanted) {
58834                   abortRequest$6(v);
58835                   delete source.inflight[k];
58836               }
58837           });
58838
58839           tiles.forEach(function(tile) {
58840               loadTile(source, tile);
58841           });
58842       },
58843
58844
58845       cache: function() {
58846           return _vtCache;
58847       }
58848
58849   };
58850
58851   var apibase$5 = 'https://www.wikidata.org/w/api.php?';
58852   var _wikidataCache = {};
58853
58854   var serviceWikidata = {
58855
58856       init: function() {},
58857
58858       reset: function() {
58859           _wikidataCache = {};
58860       },
58861
58862
58863       // Given a Wikipedia language and article title, return an array of
58864       // corresponding Wikidata entities.
58865       itemsByTitle: function(lang, title, callback) {
58866           if (!title) {
58867               callback('No title', {});
58868               return;
58869           }
58870
58871           lang = lang || 'en';
58872
58873           d3_json(apibase$5 + utilQsString({
58874               action: 'wbgetentities',
58875               format: 'json',
58876               formatversion: 2,
58877               sites: lang.replace(/-/g, '_') + 'wiki',
58878               titles: title,
58879               languages: 'en', // shrink response by filtering to one language
58880               origin: '*'
58881           }), function(err, data) {
58882               if (data && data.error) {
58883                   err = data.error;
58884               }
58885               if (err) {
58886                   callback(err, {});
58887               } else {
58888                   callback(null, data.entities || {});
58889               }
58890           });
58891       },
58892
58893
58894       entityByQID: function(qid, callback) {
58895           if (!qid) {
58896               callback('No qid', {});
58897               return;
58898           }
58899           if (_wikidataCache[qid]) {
58900               callback(null, _wikidataCache[qid]);
58901               return;
58902           }
58903
58904           var langs = uniq([
58905               currentLocale.toLowerCase(),
58906               currentLocale.split('-', 2)[0].toLowerCase(),
58907               'en'
58908           ]);
58909
58910           d3_json(apibase$5 + utilQsString({
58911               action: 'wbgetentities',
58912               format: 'json',
58913               formatversion: 2,
58914               ids: qid,
58915               props: 'labels|descriptions|claims|sitelinks',
58916               sitefilter: langs.map(function(d) { return d + 'wiki'; }).join('|'),
58917               languages: langs.join('|'),
58918               languagefallback: 1,
58919               origin: '*'
58920           }), function(err, data) {
58921               if (data && data.error) {
58922                   err = data.error;
58923               }
58924               if (err) {
58925                   callback(err, {});
58926               } else {
58927                   _wikidataCache[qid] = data.entities[qid];
58928                   callback(null, data.entities[qid] || {});
58929               }
58930           });
58931       },
58932
58933
58934       // Pass `params` object of the form:
58935       // {
58936       //   qid: 'string'      // brand wikidata  (e.g. 'Q37158')
58937       // }
58938       //
58939       // Get an result object used to display tag documentation
58940       // {
58941       //   title:        'string',
58942       //   description:  'string',
58943       //   editURL:      'string',
58944       //   imageURL:     'string',
58945       //   wiki:         { title: 'string', text: 'string', url: 'string' }
58946       // }
58947       //
58948       getDocs: function(params, callback) {
58949           this.entityByQID(params.qid, function(err, entity) {
58950               if (err || !entity) {
58951                   callback(err || 'No entity');
58952                   return;
58953               }
58954
58955               var i;
58956
58957               var description;
58958               if (entity.descriptions && Object.keys(entity.descriptions).length > 0) {
58959                   description = entity.descriptions[Object.keys(entity.descriptions)[0]].value;
58960               }
58961
58962               // prepare result
58963               var result = {
58964                   title: entity.id,
58965                   description: description,
58966                   editURL: 'https://www.wikidata.org/wiki/' + entity.id
58967               };
58968
58969               // add image
58970               if (entity.claims) {
58971                   var imageroot = 'https://commons.wikimedia.org/w/index.php';
58972                   var props = ['P154','P18'];  // logo image, image
58973                   var prop, image;
58974                   for (i = 0; i < props.length; i++) {
58975                       prop = entity.claims[props[i]];
58976                       if (prop && Object.keys(prop).length > 0) {
58977                           image = prop[Object.keys(prop)[0]].mainsnak.datavalue.value;
58978                           if (image) {
58979                               result.imageURL = imageroot + '?' + utilQsString({
58980                                   title: 'Special:Redirect/file/' + image,
58981                                   width: 400
58982                               });
58983                               break;
58984                           }
58985                       }
58986                   }
58987               }
58988
58989               if (entity.sitelinks) {
58990                   // must be one of these that we requested..
58991                   var langs = uniq([
58992                       currentLocale.toLowerCase(),
58993                       currentLocale.split('-', 2)[0].toLowerCase(),
58994                       'en'
58995                   ]);
58996                   var englishLocale = (currentLocale.split('-', 2)[0].toLowerCase() === 'en');
58997
58998                   for (i = 0; i < langs.length; i++) {   // check each, in order of preference
58999                       var w = langs[i] + 'wiki';
59000                       if (entity.sitelinks[w]) {
59001                           var title = entity.sitelinks[w].title;
59002                           var tKey = 'inspector.wiki_reference';
59003                           if (!englishLocale && langs[i] === 'en') {   // user's currentLocale isn't English but
59004                               tKey = 'inspector.wiki_en_reference';    // we are sending them to enwiki anyway..
59005                           }
59006
59007                           result.wiki = {
59008                               title: title,
59009                               text: tKey,
59010                               url: 'https://' + langs[i] + '.wikipedia.org/wiki/' + title.replace(/ /g, '_')
59011                           };
59012                           break;
59013                       }
59014                   }
59015               }
59016
59017               callback(null, result);
59018           });
59019       }
59020
59021   };
59022
59023   var endpoint = 'https://en.wikipedia.org/w/api.php?';
59024
59025   var serviceWikipedia = {
59026
59027       init: function() {},
59028       reset: function() {},
59029
59030
59031       search: function(lang, query, callback) {
59032           if (!query) {
59033               callback('', []);
59034               return;
59035           }
59036
59037           lang = lang || 'en';
59038           d3_json(endpoint.replace('en', lang) +
59039               utilQsString({
59040                   action: 'query',
59041                   list: 'search',
59042                   srlimit: '10',
59043                   srinfo: 'suggestion',
59044                   format: 'json',
59045                   origin: '*',
59046                   srsearch: query
59047               }), function(err, data) {
59048                   if (err || !data || !data.query || !data.query.search || data.error) {
59049                       callback('', []);
59050                   } else {
59051                       var results = data.query.search.map(function(d) { return d.title; });
59052                       callback(query, results);
59053                   }
59054               }
59055           );
59056       },
59057
59058
59059       suggestions: function(lang, query, callback) {
59060           if (!query) {
59061               callback('', []);
59062               return;
59063           }
59064
59065           lang = lang || 'en';
59066           d3_json(endpoint.replace('en', lang) +
59067               utilQsString({
59068                   action: 'opensearch',
59069                   namespace: 0,
59070                   suggest: '',
59071                   format: 'json',
59072                   origin: '*',
59073                   search: query
59074               }), function(err, data) {
59075                   if (err || !data || data.error) {
59076                       callback('', []);
59077                   } else {
59078                       callback(data[0], data[1] || []);
59079                   }
59080               }
59081           );
59082       },
59083
59084
59085       translations: function(lang, title, callback) {
59086           if (!title) {
59087               callback({});
59088               return;
59089           }
59090
59091           d3_json(endpoint.replace('en', lang) +
59092               utilQsString({
59093                   action: 'query',
59094                   prop: 'langlinks',
59095                   format: 'json',
59096                   origin: '*',
59097                   lllimit: 500,
59098                   titles: title
59099               }), function(err, data) {
59100                   if (err || !data || !data.query || !data.query.pages || data.error) {
59101                       callback({});
59102                   } else {
59103                       var list = data.query.pages[Object.keys(data.query.pages)[0]],
59104                           translations = {};
59105                       if (list && list.langlinks) {
59106                           list.langlinks.forEach(function(d) {
59107                               translations[d.lang] = d['*'];
59108                           });
59109                       }
59110                       callback(translations);
59111                   }
59112               }
59113           );
59114       }
59115
59116   };
59117
59118   var services = {
59119       geocoder: serviceNominatim,
59120       keepRight: serviceKeepRight,
59121       improveOSM: serviceImproveOSM,
59122       mapillary: serviceMapillary,
59123       openstreetcam: serviceOpenstreetcam,
59124       osm: serviceOsm,
59125       osmWikibase: serviceOsmWikibase,
59126       maprules: serviceMapRules,
59127       streetside: serviceStreetside,
59128       taginfo: serviceTaginfo,
59129       vectorTile: serviceVectorTile,
59130       wikidata: serviceWikidata,
59131       wikipedia: serviceWikipedia
59132   };
59133
59134   function modeAddNote(context) {
59135       var mode = {
59136           id: 'add-note',
59137           button: 'note',
59138           title: t('modes.add_note.title'),
59139           description: t('modes.add_note.description'),
59140           key: '4'
59141       };
59142
59143       var behavior = behaviorDraw(context)
59144           .tail(t('modes.add_note.tail'))
59145           .on('click', add)
59146           .on('cancel', cancel)
59147           .on('finish', cancel);
59148
59149
59150       function add(loc) {
59151           var osm = services.osm;
59152           if (!osm) return;
59153
59154           var note = osmNote({ loc: loc, status: 'open', comments: [] });
59155           osm.replaceNote(note);
59156
59157           // force a reraw (there is no history change that would otherwise do this)
59158           context.pan([0,0]);
59159
59160           context
59161               .selectedNoteID(note.id)
59162               .enter(modeSelectNote(context, note.id).newFeature(true));
59163       }
59164
59165
59166       function cancel() {
59167           context.enter(modeBrowse(context));
59168       }
59169
59170
59171       mode.enter = function() {
59172           context.install(behavior);
59173       };
59174
59175
59176       mode.exit = function() {
59177           context.uninstall(behavior);
59178       };
59179
59180
59181       return mode;
59182   }
59183
59184   function modeDragNode(context) {
59185       var mode = {
59186           id: 'drag-node',
59187           button: 'browse'
59188       };
59189       var hover = behaviorHover(context).altDisables(true)
59190           .on('hover', context.ui().sidebar.hover);
59191       var edit = behaviorEdit(context);
59192
59193       var _nudgeInterval;
59194       var _restoreSelectedIDs = [];
59195       var _wasMidpoint = false;
59196       var _isCancelled = false;
59197       var _activeEntity;
59198       var _startLoc;
59199       var _lastLoc;
59200
59201
59202       function startNudge(entity, nudge) {
59203           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
59204           _nudgeInterval = window.setInterval(function() {
59205               context.pan(nudge);
59206               doMove(entity, nudge);
59207           }, 50);
59208       }
59209
59210
59211       function stopNudge() {
59212           if (_nudgeInterval) {
59213               window.clearInterval(_nudgeInterval);
59214               _nudgeInterval = null;
59215           }
59216       }
59217
59218
59219       function moveAnnotation(entity) {
59220           return t('operations.move.annotation.' + entity.geometry(context.graph()));
59221       }
59222
59223
59224       function connectAnnotation(nodeEntity, targetEntity) {
59225           var nodeGeometry = nodeEntity.geometry(context.graph());
59226           var targetGeometry = targetEntity.geometry(context.graph());
59227           if (nodeGeometry === 'vertex' && targetGeometry === 'vertex') {
59228               var nodeParentWayIDs = context.graph().parentWays(nodeEntity);
59229               var targetParentWayIDs = context.graph().parentWays(targetEntity);
59230               var sharedParentWays = intersection(nodeParentWayIDs, targetParentWayIDs);
59231               // if both vertices are part of the same way
59232               if (sharedParentWays.length !== 0) {
59233                   // if the nodes are next to each other, they are merged
59234                   if (sharedParentWays[0].areAdjacent(nodeEntity.id, targetEntity.id)) {
59235                       return t('operations.connect.annotation.from_vertex.to_adjacent_vertex');
59236                   }
59237                   return t('operations.connect.annotation.from_vertex.to_sibling_vertex');
59238               }
59239           }
59240           return t('operations.connect.annotation.from_' + nodeGeometry + '.to_' + targetGeometry);
59241       }
59242
59243
59244       function shouldSnapToNode(target) {
59245           return _activeEntity.geometry(context.graph()) !== 'vertex' ||
59246               context.presets().allowsVertex(target, context.graph());
59247       }
59248
59249
59250       function origin(entity) {
59251           return context.projection(entity.loc);
59252       }
59253
59254
59255       function keydown() {
59256           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
59257               if (context.surface().classed('nope')) {
59258                   context.surface()
59259                       .classed('nope-suppressed', true);
59260               }
59261               context.surface()
59262                   .classed('nope', false)
59263                   .classed('nope-disabled', true);
59264           }
59265       }
59266
59267
59268       function keyup() {
59269           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
59270               if (context.surface().classed('nope-suppressed')) {
59271                   context.surface()
59272                       .classed('nope', true);
59273               }
59274               context.surface()
59275                   .classed('nope-suppressed', false)
59276                   .classed('nope-disabled', false);
59277           }
59278       }
59279
59280
59281       function start(entity) {
59282           _wasMidpoint = entity.type === 'midpoint';
59283           var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
59284           _isCancelled = event.sourceEvent.shiftKey || hasHidden;
59285
59286
59287           if (_isCancelled) {
59288               if (hasHidden) {
59289                   uiFlash()
59290                       .duration(4000)
59291                       .text(t('modes.drag_node.connected_to_hidden'))();
59292               }
59293               return drag.cancel();
59294           }
59295
59296           if (_wasMidpoint) {
59297               var midpoint = entity;
59298               entity = osmNode();
59299               context.perform(actionAddMidpoint(midpoint, entity));
59300               entity = context.entity(entity.id);   // get post-action entity
59301
59302               var vertex = context.surface().selectAll('.' + entity.id);
59303               drag.target(vertex.node(), entity);
59304
59305           } else {
59306               context.perform(actionNoop());
59307           }
59308
59309           _activeEntity = entity;
59310           _startLoc = entity.loc;
59311
59312           hover.ignoreVertex(entity.geometry(context.graph()) === 'vertex');
59313
59314           context.surface().selectAll('.' + _activeEntity.id)
59315               .classed('active', true);
59316
59317           context.enter(mode);
59318       }
59319
59320
59321       // related code
59322       // - `behavior/draw.js` `datum()`
59323       function datum() {
59324           var event$1 = event && event.sourceEvent;
59325           if (!event$1 || event$1.altKey) {
59326               return {};
59327           } else {
59328               // When dragging, snap only to touch targets..
59329               // (this excludes area fills and active drawing elements)
59330               var d = event$1.target.__data__;
59331               return (d && d.properties && d.properties.target) ? d : {};
59332           }
59333       }
59334
59335
59336       function doMove(entity, nudge) {
59337           nudge = nudge || [0, 0];
59338
59339           var currPoint = (event && event.point) || context.projection(_lastLoc);
59340           var currMouse = geoVecSubtract(currPoint, nudge);
59341           var loc = context.projection.invert(currMouse);
59342
59343           if (!_nudgeInterval) {   // If not nudging at the edge of the viewport, try to snap..
59344               // related code
59345               // - `mode/drag_node.js`     `doMode()`
59346               // - `behavior/draw.js`      `click()`
59347               // - `behavior/draw_way.js`  `move()`
59348               var d = datum();
59349               var target = d && d.properties && d.properties.entity;
59350               var targetLoc = target && target.loc;
59351               var targetNodes = d && d.properties && d.properties.nodes;
59352               var edge;
59353
59354               if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
59355                   if (shouldSnapToNode(target)) {
59356                       loc = targetLoc;
59357                   }
59358
59359               } else if (targetNodes) {   // snap to way - a line target with `.nodes`
59360                   edge = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
59361                   if (edge) {
59362                       loc = edge.loc;
59363                   }
59364               }
59365           }
59366
59367           context.replace(
59368               actionMoveNode(entity.id, loc)
59369           );
59370
59371           // Below here: validations
59372           var isInvalid = false;
59373
59374           // Check if this connection to `target` could cause relations to break..
59375           if (target) {
59376               isInvalid = hasRelationConflict(entity, target, edge, context.graph());
59377           }
59378
59379           // Check if this drag causes the geometry to break..
59380           if (!isInvalid) {
59381               isInvalid = hasInvalidGeometry(entity, context.graph());
59382           }
59383
59384
59385           var nope = context.surface().classed('nope');
59386           if (isInvalid === 'relation' || isInvalid === 'restriction') {
59387               if (!nope) {   // about to nope - show hint
59388                   uiFlash()
59389                       .duration(4000)
59390                       .text(t('operations.connect.' + isInvalid,
59391                           { relation: context.presets().item('type/restriction').name() }
59392                       ))();
59393               }
59394           } else {
59395               if (nope) {   // about to un-nope, remove hint
59396                   uiFlash()
59397                       .duration(1)
59398                       .text('')();
59399               }
59400           }
59401
59402
59403           var nopeDisabled = context.surface().classed('nope-disabled');
59404           if (nopeDisabled) {
59405               context.surface()
59406                   .classed('nope', false)
59407                   .classed('nope-suppressed', isInvalid);
59408           } else {
59409               context.surface()
59410                   .classed('nope', isInvalid)
59411                   .classed('nope-suppressed', false);
59412           }
59413
59414           _lastLoc = loc;
59415       }
59416
59417
59418       // Uses `actionConnect.disabled()` to know whether this connection is ok..
59419       function hasRelationConflict(entity, target, edge, graph) {
59420           var testGraph = graph.update();  // copy
59421
59422           // if snapping to way - add midpoint there and consider that the target..
59423           if (edge) {
59424               var midpoint = osmNode();
59425               var action = actionAddMidpoint({
59426                   loc: edge.loc,
59427                   edge: [target.nodes[edge.index - 1], target.nodes[edge.index]]
59428               }, midpoint);
59429
59430               testGraph = action(testGraph);
59431               target = midpoint;
59432           }
59433
59434           // can we connect to it?
59435           var ids = [entity.id, target.id];
59436           return actionConnect(ids).disabled(testGraph);
59437       }
59438
59439
59440       function hasInvalidGeometry(entity, graph) {
59441           var parents = graph.parentWays(entity);
59442           var i, j, k;
59443
59444           for (i = 0; i < parents.length; i++) {
59445               var parent = parents[i];
59446               var nodes = [];
59447               var activeIndex = null;    // which multipolygon ring contains node being dragged
59448
59449               // test any parent multipolygons for valid geometry
59450               var relations = graph.parentRelations(parent);
59451               for (j = 0; j < relations.length; j++) {
59452                   if (!relations[j].isMultipolygon()) continue;
59453
59454                   var rings = osmJoinWays(relations[j].members, graph);
59455
59456                   // find active ring and test it for self intersections
59457                   for (k = 0; k < rings.length; k++) {
59458                       nodes = rings[k].nodes;
59459                       if (find$1(nodes, function(n) { return n.id === entity.id; })) {
59460                           activeIndex = k;
59461                           if (geoHasSelfIntersections(nodes, entity.id)) {
59462                               return true;
59463                           }
59464                       }
59465                       rings[k].coords = nodes.map(function(n) { return n.loc; });
59466                   }
59467
59468                   // test active ring for intersections with other rings in the multipolygon
59469                   for (k = 0; k < rings.length; k++) {
59470                       if (k === activeIndex) continue;
59471
59472                       // make sure active ring doesnt cross passive rings
59473                       if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
59474                           return true;
59475                       }
59476                   }
59477               }
59478
59479
59480               // If we still haven't tested this node's parent way for self-intersections.
59481               // (because it's not a member of a multipolygon), test it now.
59482               if (activeIndex === null) {
59483                   nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
59484                   if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
59485                       return true;
59486                   }
59487               }
59488
59489           }
59490
59491           return false;
59492       }
59493
59494
59495       function move(entity) {
59496           if (_isCancelled) return;
59497           event.sourceEvent.stopPropagation();
59498
59499           context.surface().classed('nope-disabled', event.sourceEvent.altKey);
59500
59501           _lastLoc = context.projection.invert(event.point);
59502
59503           doMove(entity);
59504           var nudge = geoViewportEdge(event.point, context.map().dimensions());
59505           if (nudge) {
59506               startNudge(entity, nudge);
59507           } else {
59508               stopNudge();
59509           }
59510       }
59511
59512       function end(entity) {
59513           if (_isCancelled) return;
59514
59515           var d = datum();
59516           var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope');
59517           var target = d && d.properties && d.properties.entity;   // entity to snap to
59518
59519           if (nope) {   // bounce back
59520               context.perform(
59521                   _actionBounceBack(entity.id, _startLoc)
59522               );
59523
59524           } else if (target && target.type === 'way') {
59525               var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id);
59526               context.replace(
59527                   actionAddMidpoint({
59528                       loc: choice.loc,
59529                       edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
59530                   }, entity),
59531                   connectAnnotation(entity, target)
59532               );
59533
59534           } else if (target && target.type === 'node' && shouldSnapToNode(target)) {
59535               context.replace(
59536                   actionConnect([target.id, entity.id]),
59537                   connectAnnotation(entity, target)
59538               );
59539
59540           } else if (_wasMidpoint) {
59541               context.replace(
59542                   actionNoop(),
59543                   t('operations.add.annotation.vertex')
59544               );
59545
59546           } else {
59547               context.replace(
59548                   actionNoop(),
59549                   moveAnnotation(entity)
59550               );
59551           }
59552
59553           var reselection = _restoreSelectedIDs.filter(function(id) {
59554               return context.graph().hasEntity(id);
59555           });
59556
59557           if (reselection.length) {
59558               context.enter(modeSelect(context, reselection));
59559           } else {
59560               context.enter(modeBrowse(context));
59561           }
59562       }
59563
59564
59565       function _actionBounceBack(nodeID, toLoc) {
59566           var moveNode = actionMoveNode(nodeID, toLoc);
59567           var action = function(graph, t) {
59568               // last time through, pop off the bounceback perform.
59569               // it will then overwrite the initial perform with a moveNode that does nothing
59570               if (t === 1) context.pop();
59571               return moveNode(graph, t);
59572           };
59573           action.transitionable = true;
59574           return action;
59575       }
59576
59577
59578       function cancel() {
59579           drag.cancel();
59580           context.enter(modeBrowse(context));
59581       }
59582
59583
59584       var drag = behaviorDrag()
59585           .selector('.layer-touch.points .target')
59586           .surface(select('#map').node())
59587           .origin(origin)
59588           .on('start', start)
59589           .on('move', move)
59590           .on('end', end);
59591
59592
59593       mode.enter = function() {
59594           context.install(hover);
59595           context.install(edit);
59596
59597           select(window)
59598               .on('keydown.drawWay', keydown)
59599               .on('keyup.drawWay', keyup);
59600
59601           context.history()
59602               .on('undone.drag-node', cancel);
59603       };
59604
59605
59606       mode.exit = function() {
59607           context.ui().sidebar.hover.cancel();
59608           context.uninstall(hover);
59609           context.uninstall(edit);
59610
59611           select(window)
59612               .on('keydown.hover', null)
59613               .on('keyup.hover', null);
59614
59615           context.history()
59616               .on('undone.drag-node', null);
59617
59618           _activeEntity = null;
59619
59620           context.surface()
59621               .classed('nope', false)
59622               .classed('nope-suppressed', false)
59623               .classed('nope-disabled', false)
59624               .selectAll('.active')
59625               .classed('active', false);
59626
59627           stopNudge();
59628       };
59629
59630
59631       mode.selectedIDs = function() {
59632           if (!arguments.length) return _activeEntity ? [_activeEntity.id] : [];
59633           // no assign
59634           return mode;
59635       };
59636
59637
59638       mode.activeID = function() {
59639           if (!arguments.length) return _activeEntity && _activeEntity.id;
59640           // no assign
59641           return mode;
59642       };
59643
59644
59645       mode.restoreSelectedIDs = function(_) {
59646           if (!arguments.length) return _restoreSelectedIDs;
59647           _restoreSelectedIDs = _;
59648           return mode;
59649       };
59650
59651
59652       mode.behavior = drag;
59653
59654
59655       return mode;
59656   }
59657
59658   function modeDragNote(context) {
59659       var mode = {
59660           id: 'drag-note',
59661           button: 'browse'
59662       };
59663
59664       var edit = behaviorEdit(context);
59665
59666       var _nudgeInterval;
59667       var _lastLoc;
59668       var _note;    // most current note.. dragged note may have stale datum.
59669
59670
59671       function startNudge(nudge) {
59672           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
59673           _nudgeInterval = window.setInterval(function() {
59674               context.pan(nudge);
59675               doMove(nudge);
59676           }, 50);
59677       }
59678
59679
59680       function stopNudge() {
59681           if (_nudgeInterval) {
59682               window.clearInterval(_nudgeInterval);
59683               _nudgeInterval = null;
59684           }
59685       }
59686
59687
59688       function origin(note) {
59689           return context.projection(note.loc);
59690       }
59691
59692
59693       function start(note) {
59694           _note = note;
59695           var osm = services.osm;
59696           if (osm) {
59697               // Get latest note from cache.. The marker may have a stale datum bound to it
59698               // and dragging it around can sometimes delete the users note comment.
59699               _note = osm.getNote(_note.id);
59700           }
59701
59702           context.surface().selectAll('.note-' + _note.id)
59703               .classed('active', true);
59704
59705           context.perform(actionNoop());
59706           context.enter(mode);
59707           context.selectedNoteID(_note.id);
59708       }
59709
59710
59711       function move() {
59712           event.sourceEvent.stopPropagation();
59713           _lastLoc = context.projection.invert(event.point);
59714
59715           doMove();
59716           var nudge = geoViewportEdge(event.point, context.map().dimensions());
59717           if (nudge) {
59718               startNudge(nudge);
59719           } else {
59720               stopNudge();
59721           }
59722       }
59723
59724
59725       function doMove(nudge) {
59726           nudge = nudge || [0, 0];
59727
59728           var currPoint = (event && event.point) || context.projection(_lastLoc);
59729           var currMouse = geoVecSubtract(currPoint, nudge);
59730           var loc = context.projection.invert(currMouse);
59731
59732           _note = _note.move(loc);
59733
59734           var osm = services.osm;
59735           if (osm) {
59736               osm.replaceNote(_note);  // update note cache
59737           }
59738
59739           context.replace(actionNoop());   // trigger redraw
59740       }
59741
59742
59743       function end() {
59744           context.replace(actionNoop());   // trigger redraw
59745
59746           context
59747               .selectedNoteID(_note.id)
59748               .enter(modeSelectNote(context, _note.id));
59749       }
59750
59751
59752       var drag = behaviorDrag()
59753           .selector('.layer-touch.markers .target.note.new')
59754           .surface(select('#map').node())
59755           .origin(origin)
59756           .on('start', start)
59757           .on('move', move)
59758           .on('end', end);
59759
59760
59761       mode.enter = function() {
59762           context.install(edit);
59763       };
59764
59765
59766       mode.exit = function() {
59767           context.ui().sidebar.hover.cancel();
59768           context.uninstall(edit);
59769
59770           context.surface()
59771               .selectAll('.active')
59772               .classed('active', false);
59773
59774           stopNudge();
59775       };
59776
59777       mode.behavior = drag;
59778
59779       return mode;
59780   }
59781
59782   function modeBrowse(context) {
59783       var mode = {
59784           button: 'browse',
59785           id: 'browse',
59786           title: t('modes.browse.title'),
59787           description: t('modes.browse.description')
59788       }, sidebar;
59789
59790       var behaviors = [
59791           behaviorPaste(context),
59792           behaviorHover(context).on('hover', context.ui().sidebar.hover),
59793           behaviorSelect(context),
59794           behaviorLasso(context),
59795           modeDragNode(context).behavior,
59796           modeDragNote(context).behavior
59797       ];
59798
59799
59800       mode.enter = function() {
59801           behaviors.forEach(context.install);
59802
59803           // Get focus on the body.
59804           if (document.activeElement && document.activeElement.blur) {
59805               document.activeElement.blur();
59806           }
59807
59808           if (sidebar) {
59809               context.ui().sidebar.show(sidebar);
59810           } else {
59811               context.ui().sidebar.select(null);
59812           }
59813       };
59814
59815
59816       mode.exit = function() {
59817           context.ui().sidebar.hover.cancel();
59818           behaviors.forEach(context.uninstall);
59819
59820           if (sidebar) {
59821               context.ui().sidebar.hide();
59822           }
59823       };
59824
59825
59826       mode.sidebar = function(_) {
59827           if (!arguments.length) return sidebar;
59828           sidebar = _;
59829           return mode;
59830       };
59831
59832
59833       return mode;
59834   }
59835
59836   function modeDrawArea(context, wayId, startGraph, baselineGraph) {
59837       var mode = {
59838           button: 'area',
59839           id: 'draw-area'
59840       };
59841
59842       var behavior;
59843
59844
59845       mode.enter = function() {
59846           var way = context.entity(wayId);
59847
59848           behavior = behaviorDrawWay(context, wayId, undefined, mode, startGraph, baselineGraph)
59849               .tail(t('modes.draw_area.tail'));
59850
59851           var addNode = behavior.addNode;
59852
59853           behavior.addNode = function(node, d) {
59854               var length = way.nodes.length;
59855               var penultimate = length > 2 ? way.nodes[length - 2] : null;
59856
59857               if (node.id === way.first() || node.id === penultimate) {
59858                   behavior.finish();
59859               } else {
59860                   addNode(node, d);
59861               }
59862           };
59863
59864           context.install(behavior);
59865       };
59866
59867
59868       mode.exit = function() {
59869           context.uninstall(behavior);
59870       };
59871
59872
59873       mode.selectedIDs = function() {
59874           return [wayId];
59875       };
59876
59877
59878       mode.activeID = function() {
59879           return (behavior && behavior.activeID()) || [];
59880       };
59881
59882
59883       return mode;
59884   }
59885
59886   function modeDrawLine(context, wayID, startGraph, baselineGraph, affix, continuing) {
59887       var mode = {
59888           button: 'line',
59889           id: 'draw-line'
59890       };
59891
59892       var behavior;
59893
59894       mode.isContinuing = continuing;
59895
59896       mode.enter = function() {
59897           var way = context.entity(wayID);
59898           var index = (affix === 'prefix') ? 0 : undefined;
59899           var headID = (affix === 'prefix') ? way.first() : way.last();
59900
59901           behavior = behaviorDrawWay(context, wayID, index, mode, startGraph, baselineGraph)
59902               .tail(t('modes.draw_line.tail'));
59903
59904           var addNode = behavior.addNode;
59905           behavior.addNode = function(node, d) {
59906               if (node.id === headID) {
59907                   behavior.finish();
59908               } else {
59909                   addNode(node, d);
59910               }
59911           };
59912
59913           context.install(behavior);
59914       };
59915
59916
59917       mode.exit = function() {
59918           context.uninstall(behavior);
59919       };
59920
59921
59922       mode.selectedIDs = function() {
59923           return [wayID];
59924       };
59925
59926
59927       mode.activeID = function() {
59928           return (behavior && behavior.activeID()) || [];
59929       };
59930
59931       return mode;
59932   }
59933
59934   function modeMove(context, entityIDs, baseGraph) {
59935       var mode = {
59936           id: 'move',
59937           button: 'browse'
59938       };
59939
59940       var keybinding = utilKeybinding('move');
59941       var behaviors = [
59942           behaviorEdit(context),
59943           operationCircularize(entityIDs, context).behavior,
59944           operationDelete(entityIDs, context).behavior,
59945           operationOrthogonalize(entityIDs, context).behavior,
59946           operationReflectLong(entityIDs, context).behavior,
59947           operationReflectShort(entityIDs, context).behavior,
59948           operationRotate(entityIDs, context).behavior
59949       ];
59950       var annotation = entityIDs.length === 1 ?
59951           t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
59952           t('operations.move.annotation.multiple');
59953
59954       var _prevGraph;
59955       var _cache;
59956       var _origin;
59957       var _nudgeInterval;
59958
59959
59960       function doMove(nudge) {
59961           nudge = nudge || [0, 0];
59962
59963           var fn;
59964           if (_prevGraph !== context.graph()) {
59965               _cache = {};
59966               _origin = context.map().mouseCoordinates();
59967               fn = context.perform;
59968           } else {
59969               fn = context.overwrite;
59970           }
59971
59972           var currMouse = context.mouse();
59973           var origMouse = context.projection(_origin);
59974           var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
59975
59976           fn(actionMove(entityIDs, delta, context.projection, _cache));
59977           _prevGraph = context.graph();
59978       }
59979
59980
59981       function startNudge(nudge) {
59982           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
59983           _nudgeInterval = window.setInterval(function() {
59984               context.pan(nudge);
59985               doMove(nudge);
59986           }, 50);
59987       }
59988
59989
59990       function stopNudge() {
59991           if (_nudgeInterval) {
59992               window.clearInterval(_nudgeInterval);
59993               _nudgeInterval = null;
59994           }
59995       }
59996
59997
59998       function move() {
59999           doMove();
60000           var nudge = geoViewportEdge(context.mouse(), context.map().dimensions());
60001           if (nudge) {
60002               startNudge(nudge);
60003           } else {
60004               stopNudge();
60005           }
60006       }
60007
60008
60009       function finish() {
60010           event.stopPropagation();
60011           context.replace(actionNoop(), annotation);
60012           context.enter(modeSelect(context, entityIDs));
60013           stopNudge();
60014       }
60015
60016
60017       function cancel() {
60018           if (baseGraph) {
60019               while (context.graph() !== baseGraph) context.pop();
60020               context.enter(modeBrowse(context));
60021           } else {
60022               context.pop();
60023               context.enter(modeSelect(context, entityIDs));
60024           }
60025           stopNudge();
60026       }
60027
60028
60029       function undone() {
60030           context.enter(modeBrowse(context));
60031       }
60032
60033
60034       mode.enter = function() {
60035           _origin = context.map().mouseCoordinates();
60036           _prevGraph = null;
60037           _cache = {};
60038
60039           context.features().forceVisible(entityIDs);
60040
60041           behaviors.forEach(context.install);
60042
60043           context.surface()
60044               .on('mousemove.move', move)
60045               .on('click.move', finish);
60046
60047           context.history()
60048               .on('undone.move', undone);
60049
60050           keybinding
60051               .on('⎋', cancel)
60052               .on('↩', finish);
60053
60054           select(document)
60055               .call(keybinding);
60056       };
60057
60058
60059       mode.exit = function() {
60060           stopNudge();
60061
60062           behaviors.forEach(function(behavior) {
60063               context.uninstall(behavior);
60064           });
60065
60066           context.surface()
60067               .on('mousemove.move', null)
60068               .on('click.move', null);
60069
60070           context.history()
60071               .on('undone.move', null);
60072
60073           select(document)
60074               .call(keybinding.unbind);
60075
60076           context.features().forceVisible([]);
60077       };
60078
60079
60080       mode.selectedIDs = function() {
60081           if (!arguments.length) return entityIDs;
60082           // no assign
60083           return mode;
60084       };
60085
60086
60087       return mode;
60088   }
60089
60090   function modeRotate(context, entityIDs) {
60091       var mode = {
60092           id: 'rotate',
60093           button: 'browse'
60094       };
60095
60096       var keybinding = utilKeybinding('rotate');
60097       var behaviors = [
60098           behaviorEdit(context),
60099           operationCircularize(entityIDs, context).behavior,
60100           operationDelete(entityIDs, context).behavior,
60101           operationMove(entityIDs, context).behavior,
60102           operationOrthogonalize(entityIDs, context).behavior,
60103           operationReflectLong(entityIDs, context).behavior,
60104           operationReflectShort(entityIDs, context).behavior
60105       ];
60106       var annotation = entityIDs.length === 1 ?
60107           t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
60108           t('operations.rotate.annotation.multiple');
60109
60110       var _prevGraph;
60111       var _prevAngle;
60112       var _prevTransform;
60113       var _pivot;
60114
60115
60116       function doRotate() {
60117           var fn;
60118           if (context.graph() !== _prevGraph) {
60119               fn = context.perform;
60120           } else {
60121               fn = context.replace;
60122           }
60123
60124           // projection changed, recalculate _pivot
60125           var projection = context.projection;
60126           var currTransform = projection.transform();
60127           if (!_prevTransform ||
60128               currTransform.k !== _prevTransform.k ||
60129               currTransform.x !== _prevTransform.x ||
60130               currTransform.y !== _prevTransform.y) {
60131
60132               var nodes = utilGetAllNodes(entityIDs, context.graph());
60133               var points = nodes.map(function(n) { return projection(n.loc); });
60134
60135               if (points.length === 1) {  // degenerate case
60136                   _pivot = points[0];
60137               } else if (points.length === 2) {
60138                   _pivot = geoVecInterp(points[0], points[1], 0.5);
60139               } else {
60140                   _pivot = d3_polygonCentroid(d3_polygonHull(points));
60141               }
60142               _prevAngle = undefined;
60143           }
60144
60145
60146           var currMouse = context.mouse();
60147           var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
60148
60149           if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
60150           var delta = currAngle - _prevAngle;
60151
60152           fn(actionRotate(entityIDs, _pivot, delta, projection));
60153
60154           _prevTransform = currTransform;
60155           _prevAngle = currAngle;
60156           _prevGraph = context.graph();
60157       }
60158
60159
60160       function finish() {
60161           event.stopPropagation();
60162           context.replace(actionNoop(), annotation);
60163           context.enter(modeSelect(context, entityIDs));
60164       }
60165
60166
60167       function cancel() {
60168           context.pop();
60169           context.enter(modeSelect(context, entityIDs));
60170       }
60171
60172
60173       function undone() {
60174           context.enter(modeBrowse(context));
60175       }
60176
60177
60178       mode.enter = function() {
60179           context.features().forceVisible(entityIDs);
60180
60181           behaviors.forEach(context.install);
60182
60183           context.surface()
60184               .on('mousemove.rotate', doRotate)
60185               .on('click.rotate', finish);
60186
60187           context.history()
60188               .on('undone.rotate', undone);
60189
60190           keybinding
60191               .on('⎋', cancel)
60192               .on('↩', finish);
60193
60194           select(document)
60195               .call(keybinding);
60196       };
60197
60198
60199       mode.exit = function() {
60200           behaviors.forEach(context.uninstall);
60201
60202           context.surface()
60203               .on('mousemove.rotate', null)
60204               .on('click.rotate', null);
60205
60206           context.history()
60207               .on('undone.rotate', null);
60208
60209           select(document)
60210               .call(keybinding.unbind);
60211
60212           context.features().forceVisible([]);
60213       };
60214
60215
60216       mode.selectedIDs = function() {
60217           if (!arguments.length) return entityIDs;
60218           // no assign
60219           return mode;
60220       };
60221
60222
60223       return mode;
60224   }
60225
60226   var _isSaving = false;
60227
60228
60229   function modeSave(context) {
60230       var mode = { id: 'save' };
60231       var keybinding = utilKeybinding('modeSave');
60232
60233       var loading = uiLoading(context)
60234           .message(t('save.uploading'))
60235           .blocking(true);
60236
60237       var commit = uiCommit(context)
60238           .on('cancel', cancel)
60239           .on('save', save);
60240
60241       var _toCheck = [];
60242       var _toLoad = [];
60243       var _loaded = {};
60244       var _toLoadCount = 0;
60245       var _toLoadTotal = 0;
60246
60247       var _conflicts = [];
60248       var _errors = [];
60249       var _origChanges;
60250       var _location;
60251
60252
60253       function cancel(selectedID) {
60254           if (selectedID) {
60255               context.enter(modeSelect(context, [selectedID]));
60256           } else {
60257               context.enter(modeBrowse(context));
60258           }
60259       }
60260
60261
60262       function save(changeset, tryAgain, checkConflicts) {
60263           // Guard against accidentally entering save code twice - #4641
60264           if (_isSaving && !tryAgain) {
60265               return;
60266           }
60267
60268           var osm = context.connection();
60269           if (!osm) {
60270               cancel();
60271               return;
60272           }
60273
60274           // If user somehow got logged out mid-save, try to reauthenticate..
60275           // This can happen if they were logged in from before, but the tokens are no longer valid.
60276           if (!osm.authenticated()) {
60277               osm.authenticate(function(err) {
60278                   if (err) {
60279                       cancel();   // quit save mode..
60280                   } else {
60281                       save(changeset, tryAgain, checkConflicts);  // continue where we left off..
60282                   }
60283               });
60284               return;
60285           }
60286
60287           if (!_isSaving) {
60288               keybindingOff();
60289               context.container().call(loading);  // block input
60290               _isSaving = true;
60291           }
60292
60293           var history = context.history();
60294           var localGraph = context.graph();
60295           var remoteGraph = coreGraph(history.base(), true);
60296
60297           _conflicts = [];
60298           _errors = [];
60299
60300           // Store original changes, in case user wants to download them as an .osc file
60301           _origChanges = history.changes(actionDiscardTags(history.difference()));
60302
60303           // First time, `history.perform` a no-op action.
60304           // Any conflict resolutions will be done as `history.replace`
60305           if (!tryAgain) {
60306               history.perform(actionNoop());
60307           }
60308
60309           // Attempt a fast upload.. If there are conflicts, re-enter with `checkConflicts = true`
60310           if (!checkConflicts) {
60311               upload(changeset);
60312
60313           // Do the full (slow) conflict check..
60314           } else {
60315               var modified = filter(history.difference().summary(), { changeType: 'modified' });
60316               _toCheck = map$3(map$3(modified, 'entity'), 'id');
60317               _toLoad = withChildNodes(_toCheck, localGraph);
60318               _loaded = {};
60319               _toLoadCount = 0;
60320               _toLoadTotal = _toLoad.length;
60321
60322               if (_toCheck.length) {
60323                   showProgress(_toLoadCount, _toLoadTotal);
60324                   _toLoad.forEach(function(id) { _loaded[id] = false; });
60325                   osm.loadMultiple(_toLoad, loaded);
60326               } else {
60327                   upload(changeset);
60328               }
60329           }
60330
60331           return;
60332
60333
60334           function withChildNodes(ids, graph) {
60335               return uniq(reduce(ids, function(result, id) {
60336                   var entity = graph.entity(id);
60337                   if (entity.type === 'way') {
60338                       try {
60339                           var children = graph.childNodes(entity);
60340                           result.push.apply(result, map$3(filter(children, 'version'), 'id'));
60341                       } catch (err) {
60342                           /* eslint-disable no-console */
60343                           if (typeof console !== 'undefined') console.error(err);
60344                           /* eslint-enable no-console */
60345                       }
60346                   }
60347                   return result;
60348               }, clone(ids)));
60349           }
60350
60351
60352           // Reload modified entities into an alternate graph and check for conflicts..
60353           function loaded(err, result) {
60354               if (_errors.length) return;
60355
60356               if (err) {
60357                   _errors.push({
60358                       msg: err.message || err.responseText,
60359                       details: [ t('save.status_code', { code: err.status }) ]
60360                   });
60361                   showErrors();
60362
60363               } else {
60364                   var loadMore = [];
60365
60366                   result.data.forEach(function(entity) {
60367                       remoteGraph.replace(entity);
60368                       _loaded[entity.id] = true;
60369                       _toLoad = without(_toLoad, entity.id);
60370
60371                       if (!entity.visible) return;
60372
60373                       // Because loadMultiple doesn't download /full like loadEntity,
60374                       // need to also load children that aren't already being checked..
60375                       var i, id;
60376                       if (entity.type === 'way') {
60377                           for (i = 0; i < entity.nodes.length; i++) {
60378                               id = entity.nodes[i];
60379                               if (_loaded[id] === undefined) {
60380                                   _loaded[id] = false;
60381                                   loadMore.push(id);
60382                               }
60383                           }
60384                       } else if (entity.type === 'relation' && entity.isMultipolygon()) {
60385                           for (i = 0; i < entity.members.length; i++) {
60386                               id = entity.members[i].id;
60387                               if (_loaded[id] === undefined) {
60388                                   _loaded[id] = false;
60389                                   loadMore.push(id);
60390                               }
60391                           }
60392                       }
60393                   });
60394
60395                   _toLoadCount += result.data.length;
60396                   _toLoadTotal += loadMore.length;
60397                   showProgress(_toLoadCount, _toLoadTotal);
60398
60399                   if (loadMore.length) {
60400                       _toLoad.push.apply(_toLoad, loadMore);
60401                       osm.loadMultiple(loadMore, loaded);
60402                   }
60403
60404                   if (!_toLoad.length) {
60405                       detectConflicts();
60406                   }
60407               }
60408           }
60409
60410
60411           function detectConflicts() {
60412               function choice(id, text, action) {
60413                   return { id: id, text: text, action: function() { history.replace(action); } };
60414               }
60415               function formatUser(d) {
60416                   return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
60417               }
60418               function entityName(entity) {
60419                   return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
60420               }
60421
60422               function sameVersions(local, remote) {
60423                   if (local.version !== remote.version) return false;
60424
60425                   if (local.type === 'way') {
60426                       var children = union(local.nodes, remote.nodes);
60427                       for (var i = 0; i < children.length; i++) {
60428                           var a = localGraph.hasEntity(children[i]);
60429                           var b = remoteGraph.hasEntity(children[i]);
60430                           if (a && b && a.version !== b.version) return false;
60431                       }
60432                   }
60433
60434                   return true;
60435               }
60436
60437               _toCheck.forEach(function(id) {
60438                   var local = localGraph.entity(id);
60439                   var remote = remoteGraph.entity(id);
60440
60441                   if (sameVersions(local, remote)) return;
60442
60443                   var action = actionMergeRemoteChanges;
60444                   var merge = action(id, localGraph, remoteGraph, formatUser);
60445
60446                   history.replace(merge);
60447
60448                   var mergeConflicts = merge.conflicts();
60449                   if (!mergeConflicts.length) return;  // merged safely
60450
60451                   var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local');
60452                   var forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote');
60453                   var keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore'));
60454                   var keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
60455
60456                   _conflicts.push({
60457                       id: id,
60458                       name: entityName(local),
60459                       details: mergeConflicts,
60460                       chosen: 1,
60461                       choices: [
60462                           choice(id, keepMine, forceLocal),
60463                           choice(id, keepTheirs, forceRemote)
60464                       ]
60465                   });
60466               });
60467
60468               upload(changeset);
60469           }
60470       }
60471
60472
60473       function upload(changeset) {
60474           var osm = context.connection();
60475           if (!osm) {
60476               _errors.push({ msg: 'No OSM Service' });
60477           }
60478
60479           if (_conflicts.length) {
60480               _conflicts.sort(function(a, b) { return b.id.localeCompare(a.id); });
60481               showConflicts(changeset);
60482
60483           } else if (_errors.length) {
60484               showErrors();
60485
60486           } else {
60487               var history = context.history();
60488               var changes = history.changes(actionDiscardTags(history.difference()));
60489               if (changes.modified.length || changes.created.length || changes.deleted.length) {
60490                   loadLocation();  // so it is ready when we display the save screen
60491                   osm.putChangeset(changeset, changes, uploadCallback);
60492               } else {        // changes were insignificant or reverted by user
60493                   select('.inspector-wrap *').remove();
60494                   loading.close();
60495                   _isSaving = false;
60496                   context.flush();
60497                   cancel();
60498               }
60499           }
60500       }
60501
60502
60503       function uploadCallback(err, changeset) {
60504           if (err) {
60505               if (err.status === 409) {          // 409 Conflict
60506                   save(changeset, true, true);   // tryAgain = true, checkConflicts = true
60507               } else {
60508                   _errors.push({
60509                       msg: err.message || err.responseText,
60510                       details: [ t('save.status_code', { code: err.status }) ]
60511                   });
60512                   showErrors();
60513               }
60514
60515           } else {
60516               context.history().clearSaved();
60517               success(changeset);
60518               // Add delay to allow for postgres replication #1646 #2678
60519               window.setTimeout(function() {
60520                   select('.inspector-wrap *').remove();
60521                   loading.close();
60522                   _isSaving = false;
60523                   context.flush();
60524               }, 2500);
60525           }
60526       }
60527
60528
60529       function showProgress(num, total) {
60530           var modal = context.container().select('.loading-modal .modal-section');
60531           var progress = modal.selectAll('.progress')
60532               .data([0]);
60533
60534           // enter/update
60535           progress.enter()
60536               .append('div')
60537               .attr('class', 'progress')
60538               .merge(progress)
60539               .text(t('save.conflict_progress', { num: num, total: total }));
60540       }
60541
60542
60543       function showConflicts(changeset) {
60544           var history = context.history();
60545           var selection = context.container()
60546               .select('#sidebar')
60547               .append('div')
60548               .attr('class','sidebar-component');
60549
60550           loading.close();
60551           _isSaving = false;
60552
60553           var ui = uiConflicts(context)
60554               .conflictList(_conflicts)
60555               .origChanges(_origChanges)
60556               .on('cancel', function() {
60557                   history.pop();
60558                   selection.remove();
60559                   keybindingOn();
60560               })
60561               .on('save', function() {
60562                   for (var i = 0; i < _conflicts.length; i++) {
60563                       if (_conflicts[i].chosen === 1) {  // user chose "keep theirs"
60564                           var entity = context.hasEntity(_conflicts[i].id);
60565                           if (entity && entity.type === 'way') {
60566                               var children = uniq(entity.nodes);
60567                               for (var j = 0; j < children.length; j++) {
60568                                   history.replace(actionRevert(children[j]));
60569                               }
60570                           }
60571                           history.replace(actionRevert(_conflicts[i].id));
60572                       }
60573                   }
60574
60575                   selection.remove();
60576                   save(changeset, true, false);  // tryAgain = true, checkConflicts = false
60577               });
60578
60579           selection.call(ui);
60580       }
60581
60582
60583       function showErrors() {
60584           keybindingOn();
60585           context.history().pop();
60586           loading.close();
60587           _isSaving = false;
60588
60589           var selection = uiConfirm(context.container());
60590           selection
60591               .select('.modal-section.header')
60592               .append('h3')
60593               .text(t('save.error'));
60594
60595           addErrors(selection, _errors);
60596           selection.okButton();
60597       }
60598
60599
60600       function addErrors(selection, data) {
60601           var message = selection
60602               .select('.modal-section.message-text');
60603
60604           var items = message
60605               .selectAll('.error-container')
60606               .data(data);
60607
60608           var enter = items.enter()
60609               .append('div')
60610               .attr('class', 'error-container');
60611
60612           enter
60613               .append('a')
60614               .attr('class', 'error-description')
60615               .attr('href', '#')
60616               .classed('hide-toggle', true)
60617               .text(function(d) { return d.msg || t('save.unknown_error_details'); })
60618               .on('click', function() {
60619                   event.preventDefault();
60620
60621                   var error = select(this);
60622                   var detail = select(this.nextElementSibling);
60623                   var exp = error.classed('expanded');
60624
60625                   detail.style('display', exp ? 'none' : 'block');
60626                   error.classed('expanded', !exp);
60627               });
60628
60629           var details = enter
60630               .append('div')
60631               .attr('class', 'error-detail-container')
60632               .style('display', 'none');
60633
60634           details
60635               .append('ul')
60636               .attr('class', 'error-detail-list')
60637               .selectAll('li')
60638               .data(function(d) { return d.details || []; })
60639               .enter()
60640               .append('li')
60641               .attr('class', 'error-detail-item')
60642               .text(function(d) { return d; });
60643
60644           items.exit()
60645               .remove();
60646       }
60647
60648
60649       function success(changeset) {
60650           commit.reset();
60651
60652           var ui = uiSuccess(context)
60653               .changeset(changeset)
60654               .location(_location)
60655               .on('cancel', function() { context.ui().sidebar.hide(); });
60656
60657           context.enter(modeBrowse(context).sidebar(ui));
60658       }
60659
60660
60661       function keybindingOn() {
60662           select(document)
60663               .call(keybinding.on('⎋', cancel, true));
60664       }
60665
60666
60667       function keybindingOff() {
60668           select(document)
60669               .call(keybinding.unbind);
60670       }
60671
60672
60673       // Reverse geocode current map location so we can display a message on
60674       // the success screen like "Thank you for editing around city, state."
60675       function loadLocation() {
60676           _location = null;
60677           if (!services.geocoder) return;
60678
60679           services.geocoder.reverse(context.map().center(), function(err, result) {
60680               if (err || !result || !result.address) return;
60681
60682               var parts = [];
60683               var addr = result.address;
60684               var city = addr && (addr.town || addr.city || addr.county);
60685               if (city) parts.push(city);
60686               var region = addr && (addr.state || addr.country);
60687               if (region) parts.push(region);
60688
60689               _location = parts.join(', ');
60690           });
60691       }
60692
60693
60694       mode.enter = function() {
60695           // Show sidebar
60696           context.ui().sidebar.expand();
60697
60698           function done() {
60699               context.ui().sidebar.show(commit);
60700           }
60701
60702           keybindingOn();
60703
60704           context.container().selectAll('#content')
60705               .attr('class', 'inactive');
60706
60707           var osm = context.connection();
60708           if (!osm) {
60709               cancel();
60710               return;
60711           }
60712
60713           if (osm.authenticated()) {
60714               done();
60715           } else {
60716               osm.authenticate(function(err) {
60717                   if (err) {
60718                       cancel();
60719                   } else {
60720                       done();
60721                   }
60722               });
60723           }
60724       };
60725
60726
60727       mode.exit = function() {
60728           _isSaving = false;
60729
60730           keybindingOff();
60731
60732           context.container().selectAll('#content')
60733               .attr('class', 'active');
60734
60735           context.ui().sidebar.hide();
60736       };
60737
60738       return mode;
60739   }
60740
60741   // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
60742   // For example, ⌘Z -> Ctrl+Z
60743   var uiCmd = function (code) {
60744       var detected = utilDetect();
60745
60746       if (detected.os === 'mac') {
60747           return code;
60748       }
60749
60750       if (detected.os === 'win') {
60751           if (code === '⌘⇧Z') return 'Ctrl+Y';
60752       }
60753
60754       var result = '',
60755           replacements = {
60756               '⌘': 'Ctrl',
60757               '⇧': 'Shift',
60758               '⌥': 'Alt',
60759               '⌫': 'Backspace',
60760               '⌦': 'Delete'
60761           };
60762
60763       for (var i = 0; i < code.length; i++) {
60764           if (code[i] in replacements) {
60765               result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
60766           } else {
60767               result += code[i];
60768           }
60769       }
60770
60771       return result;
60772   };
60773
60774
60775   // return a display-focused string for a given keyboard code
60776   uiCmd.display = function(code) {
60777       if (code.length !== 1) return code;
60778
60779       var detected = utilDetect();
60780       var mac = (detected.os === 'mac');
60781       var replacements = {
60782           '⌘': mac ? '⌘ ' + t('shortcuts.key.cmd')    : t('shortcuts.key.ctrl'),
60783           '⇧': mac ? '⇧ ' + t('shortcuts.key.shift')  : t('shortcuts.key.shift'),
60784           '⌥': mac ? '⌥ ' + t('shortcuts.key.option') : t('shortcuts.key.alt'),
60785           '⌃': mac ? '⌃ ' + t('shortcuts.key.ctrl')   : t('shortcuts.key.ctrl'),
60786           '⌫': mac ? '⌫ ' + t('shortcuts.key.delete') : t('shortcuts.key.backspace'),
60787           '⌦': mac ? '⌦ ' + t('shortcuts.key.del')    : t('shortcuts.key.del'),
60788           '↖': mac ? '↖ ' + t('shortcuts.key.pgup')   : t('shortcuts.key.pgup'),
60789           '↘': mac ? '↘ ' + t('shortcuts.key.pgdn')   : t('shortcuts.key.pgdn'),
60790           '⇞': mac ? '⇞ ' + t('shortcuts.key.home')   : t('shortcuts.key.home'),
60791           '⇟': mac ? '⇟ ' + t('shortcuts.key.end')    : t('shortcuts.key.end'),
60792           '↵': mac ? '↵ ' + t('shortcuts.key.return') : t('shortcuts.key.enter'),
60793           '⎋': mac ? '⎋ ' + t('shortcuts.key.esc')    : t('shortcuts.key.esc'),
60794       };
60795
60796       return replacements[code] || code;
60797   };
60798
60799   var _relatedParent;
60800
60801
60802   function modeSelect(context, selectedIDs) {
60803       var mode = {
60804           id: 'select',
60805           button: 'browse'
60806       };
60807
60808       var keybinding = utilKeybinding('select');
60809       var timeout = null;
60810       var behaviors = [
60811           behaviorCopy(context),
60812           behaviorPaste(context),
60813           behaviorBreathe(context),
60814           behaviorHover(context),
60815           behaviorSelect(context),
60816           behaviorLasso(context),
60817           modeDragNode(context).restoreSelectedIDs(selectedIDs).behavior,
60818           modeDragNote(context).behavior
60819       ];
60820       var editMenu;
60821       var newFeature = false;
60822       var suppressMenu = true;
60823       var follow = false;
60824
60825
60826       var wrap = context.container()
60827           .select('.inspector-wrap');
60828
60829
60830       function singular() {
60831           if (selectedIDs.length === 1) {
60832               return context.hasEntity(selectedIDs[0]);
60833           }
60834       }
60835
60836
60837       function checkSelectedIDs() {
60838           var ids = [];
60839           if (Array.isArray(selectedIDs)) {
60840               ids = selectedIDs.filter(function(id) {
60841                   return context.hasEntity(id);
60842               });
60843           }
60844
60845           if (ids.length) {
60846               selectedIDs = ids;
60847           } else {
60848               context.enter(modeBrowse(context));
60849           }
60850           return !!ids.length;
60851       }
60852
60853
60854       // find the common parent ways for nextVertex, previousVertex
60855       function commonParents() {
60856           var graph = context.graph();
60857           var commonParents = [];
60858
60859           for (var i = 0; i < selectedIDs.length; i++) {
60860               var entity = context.hasEntity(selectedIDs[i]);
60861               if (!entity || entity.geometry(graph) !== 'vertex') {
60862                   return [];  // selection includes some not vertexes
60863               }
60864
60865               var currParents = map$3(graph.parentWays(entity), 'id');
60866               if (!commonParents.length) {
60867                   commonParents = currParents;
60868                   continue;
60869               }
60870
60871               commonParents = intersection(commonParents, currParents);
60872               if (!commonParents.length) {
60873                   return [];
60874               }
60875           }
60876
60877           return commonParents;
60878       }
60879
60880
60881       function singularParent() {
60882           var parents = commonParents();
60883           if (!parents || parents.length === 0) {
60884               _relatedParent = null;
60885               return null;
60886           }
60887
60888           // relatedParent is used when we visit a vertex with multiple
60889           // parents, and we want to remember which parent line we started on.
60890
60891           if (parents.length === 1) {
60892               _relatedParent = parents[0];  // remember this parent for later
60893               return _relatedParent;
60894           }
60895
60896           if (parents.indexOf(_relatedParent) !== -1) {
60897               return _relatedParent;   // prefer the previously seen parent
60898           }
60899
60900           return parents[0];
60901       }
60902
60903
60904       function closeMenu() {
60905           if (editMenu) {
60906               context.surface().call(editMenu.close);
60907           }
60908       }
60909
60910
60911       function positionMenu() {
60912           if (!editMenu) { return; }
60913
60914           var entity = singular();
60915           if (entity && context.geometry(entity.id) === 'relation') {
60916               suppressMenu = true;
60917           } else {
60918               var point = context.mouse();
60919               var viewport = geoExtent(context.projection.clipExtent()).polygon();
60920
60921               if (point && geoPointInPolygon(point, viewport)) {
60922                   editMenu.center(point);
60923               } else {
60924                   suppressMenu = true;
60925               }
60926           }
60927       }
60928
60929
60930       function showMenu() {
60931           closeMenu();
60932           if (editMenu) {
60933               context.surface().call(editMenu);
60934           }
60935       }
60936
60937
60938       function toggleMenu() {
60939           // deprecation warning - Radial Menu to be removed in iD v3
60940           if (select('.edit-menu, .radial-menu').empty()) {
60941               positionMenu();
60942               showMenu();
60943           } else {
60944               closeMenu();
60945           }
60946       }
60947
60948
60949       mode.selectedIDs = function() {
60950           return selectedIDs;
60951       };
60952
60953
60954       mode.zoomToSelected = function() {
60955           var entity = singular();
60956           if (entity) {
60957               context.map().zoomToEase(entity);
60958           }
60959       };
60960
60961
60962       mode.reselect = function() {
60963           if (!checkSelectedIDs()) return;
60964
60965           var surfaceNode = context.surface().node();
60966           if (surfaceNode.focus) {   // FF doesn't support it
60967               surfaceNode.focus();
60968           }
60969
60970           positionMenu();
60971           if (!suppressMenu) {
60972               showMenu();
60973           }
60974       };
60975
60976
60977       mode.newFeature = function(_) {
60978           if (!arguments.length) return newFeature;
60979           newFeature = _;
60980           return mode;
60981       };
60982
60983
60984       mode.suppressMenu = function(_) {
60985           if (!arguments.length) return suppressMenu;
60986           suppressMenu = _;
60987           return mode;
60988       };
60989
60990
60991       mode.follow = function(_) {
60992           if (!arguments.length) return follow;
60993           follow = _;
60994           return mode;
60995       };
60996
60997
60998       mode.enter = function() {
60999           if (!checkSelectedIDs()) return;
61000
61001           context.features().forceVisible(selectedIDs);
61002
61003           var operations = without(values$1(Operations), operationDelete)
61004               .map(function(o) { return o(selectedIDs, context); })
61005               .filter(function(o) { return o.available(); });
61006
61007           // deprecation warning - Radial Menu to be removed in iD v3
61008           var isRadialMenu = context.storage('edit-menu-style') === 'radial';
61009           if (isRadialMenu) {
61010               operations = operations.slice(0,7);
61011               operations.unshift(operationDelete(selectedIDs, context));
61012           } else {
61013               operations.push(operationDelete(selectedIDs, context));
61014           }
61015
61016           operations.forEach(function(operation) {
61017               if (operation.behavior) {
61018                   behaviors.push(operation.behavior);
61019               }
61020           });
61021
61022           behaviors.forEach(context.install);
61023
61024           keybinding
61025               .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
61026               .on(['[', 'pgup'], previousVertex)
61027               .on([']', 'pgdown'], nextVertex)
61028               .on(['{', uiCmd('⌘['), 'home'], firstVertex)
61029               .on(['}', uiCmd('⌘]'), 'end'], lastVertex)
61030               .on(['\\', 'pause'], nextParent)
61031               .on('⎋', esc, true)
61032               .on('space', toggleMenu);
61033
61034           select(document)
61035               .call(keybinding);
61036
61037
61038           // deprecation warning - Radial Menu to be removed in iD v3
61039           editMenu = isRadialMenu
61040               ? uiRadialMenu(context, operations)
61041               : uiEditMenu(context, operations);
61042
61043           context.ui().sidebar
61044               .select(singular() ? singular().id : null, newFeature);
61045
61046           context.history()
61047               .on('undone.select', update)
61048               .on('redone.select', update);
61049
61050           context.map()
61051               .on('move.select', closeMenu)
61052               .on('drawn.select', selectElements);
61053
61054           context.surface()
61055               .on('dblclick.select', dblclick);
61056
61057
61058           selectElements();
61059
61060           if (selectedIDs.length > 1) {
61061               var entities = uiSelectionList(context, selectedIDs);
61062               context.ui().sidebar.show(entities);
61063           }
61064
61065           if (follow) {
61066               var extent = geoExtent();
61067               var graph = context.graph();
61068               selectedIDs.forEach(function(id) {
61069                   var entity = context.entity(id);
61070                   extent._extend(entity.extent(graph));
61071               });
61072
61073               var loc = extent.center();
61074               context.map().centerEase(loc);
61075           } else if (singular() && singular().type === 'way') {
61076               context.map().pan([0,0]);  // full redraw, to adjust z-sorting #2914
61077           }
61078
61079           timeout = window.setTimeout(function() {
61080               positionMenu();
61081               if (!suppressMenu) {
61082                   showMenu();
61083               }
61084           }, 270);  /* after any centerEase completes */
61085
61086
61087           function update() {
61088               closeMenu();
61089               checkSelectedIDs();
61090           }
61091
61092
61093           function dblclick() {
61094               var target = select(event.target);
61095
61096               var datum = target.datum();
61097               var entity = datum && datum.properties && datum.properties.entity;
61098               if (!entity) return;
61099
61100               if (entity instanceof osmWay && target.classed('target')) {
61101                   var choice = geoChooseEdge(context.childNodes(entity), context.mouse(), context.projection);
61102                   var prev = entity.nodes[choice.index - 1];
61103                   var next = entity.nodes[choice.index];
61104
61105                   context.perform(
61106                       actionAddMidpoint({loc: choice.loc, edge: [prev, next]}, osmNode()),
61107                       t('operations.add.annotation.vertex')
61108                   );
61109
61110                   event.preventDefault();
61111                   event.stopPropagation();
61112
61113               } else if (entity.type === 'midpoint') {
61114                   context.perform(
61115                       actionAddMidpoint({loc: entity.loc, edge: entity.edge}, osmNode()),
61116                       t('operations.add.annotation.vertex'));
61117
61118                   event.preventDefault();
61119                   event.stopPropagation();
61120               }
61121           }
61122
61123
61124           function selectElements(drawn) {
61125               if (!checkSelectedIDs()) return;
61126
61127               var surface = context.surface();
61128               var entity = singular();
61129
61130               if (entity && context.geometry(entity.id) === 'relation') {
61131                   suppressMenu = true;
61132                   return;
61133               }
61134
61135               surface.selectAll('.related')
61136                   .classed('related', false);
61137
61138               singularParent();
61139               if (_relatedParent) {
61140                   surface.selectAll(utilEntitySelector([_relatedParent]))
61141                       .classed('related', true);
61142               }
61143
61144               var selection = context.surface()
61145                   .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
61146
61147               if (selection.empty()) {
61148                   // Return to browse mode if selected DOM elements have
61149                   // disappeared because the user moved them out of view..
61150                   var source = event && event.type === 'zoom' && event.sourceEvent;
61151                   if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
61152                       context.enter(modeBrowse(context));
61153                   }
61154               } else {
61155                   selection
61156                       .classed('selected', true);
61157               }
61158           }
61159
61160
61161           function esc() {
61162               if (select('.combobox').size()) return;
61163               context.enter(modeBrowse(context));
61164           }
61165
61166
61167           function firstVertex() {
61168               event.preventDefault();
61169               var entity = singular();
61170               var parent = singularParent();
61171               var way;
61172
61173               if (entity && entity.type === 'way') {
61174                   way = entity;
61175               } else if (parent) {
61176                   way = context.entity(parent);
61177               }
61178
61179               if (way) {
61180                   context.enter(
61181                       modeSelect(context, [way.first()]).follow(true)
61182                   );
61183               }
61184           }
61185
61186
61187           function lastVertex() {
61188               event.preventDefault();
61189               var entity = singular();
61190               var parent = singularParent();
61191               var way;
61192
61193               if (entity && entity.type === 'way') {
61194                   way = entity;
61195               } else if (parent) {
61196                   way = context.entity(parent);
61197               }
61198
61199               if (way) {
61200                   context.enter(
61201                       modeSelect(context, [way.last()]).follow(true)
61202                   );
61203               }
61204           }
61205
61206
61207           function previousVertex() {
61208               event.preventDefault();
61209               var parent = singularParent();
61210               if (!parent) return;
61211
61212               var way = context.entity(parent);
61213               var length = way.nodes.length;
61214               var curr = way.nodes.indexOf(selectedIDs[0]);
61215               var index = -1;
61216
61217               if (curr > 0) {
61218                   index = curr - 1;
61219               } else if (way.isClosed()) {
61220                   index = length - 2;
61221               }
61222
61223               if (index !== -1) {
61224                   context.enter(
61225                       modeSelect(context, [way.nodes[index]]).follow(true)
61226                   );
61227               }
61228           }
61229
61230
61231           function nextVertex() {
61232               event.preventDefault();
61233               var parent = singularParent();
61234               if (!parent) return;
61235
61236               var way = context.entity(parent);
61237               var length = way.nodes.length;
61238               var curr = way.nodes.indexOf(selectedIDs[0]);
61239               var index = -1;
61240
61241               if (curr < length - 1) {
61242                   index = curr + 1;
61243               } else if (way.isClosed()) {
61244                   index = 0;
61245               }
61246
61247               if (index !== -1) {
61248                   context.enter(
61249                       modeSelect(context, [way.nodes[index]]).follow(true)
61250                   );
61251               }
61252           }
61253
61254
61255           function nextParent() {
61256               event.preventDefault();
61257               var parents = uniq(commonParents());
61258               if (!parents || parents.length < 2) return;
61259
61260               var index = parents.indexOf(_relatedParent);
61261               if (index < 0 || index > parents.length - 2) {
61262                   _relatedParent = parents[0];
61263               } else {
61264                   _relatedParent = parents[index + 1];
61265               }
61266
61267               var surface = context.surface();
61268               surface.selectAll('.related')
61269                   .classed('related', false);
61270
61271               if (_relatedParent) {
61272                   surface.selectAll(utilEntitySelector([_relatedParent]))
61273                       .classed('related', true);
61274               }
61275           }
61276       };
61277
61278
61279       mode.exit = function() {
61280           if (timeout) window.clearTimeout(timeout);
61281
61282           behaviors.forEach(context.uninstall);
61283
61284           select(document)
61285               .call(keybinding.unbind);
61286
61287           closeMenu();
61288           editMenu = undefined;
61289
61290           context.history()
61291               .on('undone.select', null)
61292               .on('redone.select', null);
61293
61294           var surface = context.surface();
61295
61296           surface
61297               .on('dblclick.select', null);
61298
61299           surface
61300               .selectAll('.selected')
61301               .classed('selected', false);
61302
61303           surface
61304               .selectAll('.related')
61305               .classed('related', false);
61306
61307           context.map().on('drawn.select', null);
61308           context.ui().sidebar.hide();
61309           context.features().forceVisible([]);
61310       };
61311
61312
61313       return mode;
61314   }
61315
61316   function modeSelectData(context, selectedDatum) {
61317       var mode = {
61318           id: 'select-data',
61319           button: 'browse'
61320       };
61321
61322       var keybinding = utilKeybinding('select-data');
61323       var dataEditor = uiDataEditor(context);
61324
61325       var behaviors = [
61326           behaviorBreathe(context),
61327           behaviorHover(context),
61328           behaviorSelect(context),
61329           behaviorLasso(context),
61330           modeDragNode(context).behavior,
61331           modeDragNote(context).behavior
61332       ];
61333
61334
61335       // class the data as selected, or return to browse mode if the data is gone
61336       function selectData(drawn) {
61337           var selection = context.surface().selectAll('.layer-mapdata .data' + selectedDatum.__featurehash__);
61338
61339           if (selection.empty()) {
61340               // Return to browse mode if selected DOM elements have
61341               // disappeared because the user moved them out of view..
61342               var source = event && event.type === 'zoom' && event.sourceEvent;
61343               if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
61344                   context.enter(modeBrowse(context));
61345               }
61346           } else {
61347               selection.classed('selected', true);
61348           }
61349       }
61350
61351
61352       function esc() {
61353           if (select('.combobox').size()) return;
61354           context.enter(modeBrowse(context));
61355       }
61356
61357
61358       mode.zoomToSelected = function() {
61359           var extent = geoExtent(d3_geoBounds(selectedDatum));
61360           context.map().centerZoomEase(extent.center(), context.map().trimmedExtentZoom(extent));
61361       };
61362
61363
61364       mode.enter = function() {
61365           behaviors.forEach(context.install);
61366
61367           keybinding
61368               .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
61369               .on('⎋', esc, true);
61370
61371           select(document)
61372               .call(keybinding);
61373
61374           selectData();
61375
61376           var sidebar = context.ui().sidebar;
61377           sidebar.show(dataEditor.datum(selectedDatum));
61378
61379           // expand the sidebar, avoid obscuring the data if needed
61380           var extent = geoExtent(d3_geoBounds(selectedDatum));
61381           sidebar.expand(sidebar.intersects(extent));
61382
61383           context.map()
61384               .on('drawn.select-data', selectData);
61385       };
61386
61387
61388       mode.exit = function() {
61389           behaviors.forEach(context.uninstall);
61390
61391           select(document)
61392               .call(keybinding.unbind);
61393
61394           context.surface()
61395               .selectAll('.layer-mapdata .selected')
61396               .classed('selected hover', false);
61397
61398           context.map()
61399               .on('drawn.select-data', null);
61400
61401           context.ui().sidebar
61402               .hide();
61403       };
61404
61405
61406       return mode;
61407   }
61408
61409   function modeSelectError(context, selectedErrorID, selectedErrorService) {
61410       var mode = {
61411           id: 'select-error',
61412           button: 'browse'
61413       };
61414
61415       var keybinding = utilKeybinding('select-error');
61416
61417       var errorService = services[selectedErrorService];
61418       var errorEditor;
61419       switch (selectedErrorService) {
61420           case 'improveOSM':
61421               errorEditor = uiImproveOsmEditor(context)
61422               .on('change', function() {
61423                   context.map().pan([0,0]);  // trigger a redraw
61424                   var error = checkSelectedID();
61425                   if (!error) return;
61426                   context.ui().sidebar
61427                       .show(errorEditor.error(error));
61428               });
61429               break;
61430           case 'keepRight':
61431               errorEditor = uiKeepRightEditor(context)
61432               .on('change', function() {
61433                   context.map().pan([0,0]);  // trigger a redraw
61434                   var error = checkSelectedID();
61435                   if (!error) return;
61436                   context.ui().sidebar
61437                       .show(errorEditor.error(error));
61438               });
61439               break;
61440       }
61441
61442
61443       var behaviors = [
61444           behaviorBreathe(context),
61445           behaviorHover(context),
61446           behaviorSelect(context),
61447           behaviorLasso(context),
61448           modeDragNode(context).behavior,
61449           modeDragNote(context).behavior
61450       ];
61451
61452
61453       function checkSelectedID() {
61454           if (!errorService) return;
61455           var error = errorService.getError(selectedErrorID);
61456           if (!error) {
61457               context.enter(modeBrowse(context));
61458           }
61459           return error;
61460       }
61461
61462
61463       mode.zoomToSelected = function() {
61464           if (!errorService) return;
61465           var error = errorService.getError(selectedErrorID);
61466           if (error) {
61467               context.map().centerZoomEase(error.loc, 20);
61468           }
61469       };
61470
61471
61472       mode.enter = function() {
61473           var error = checkSelectedID();
61474           if (!error) return;
61475
61476           behaviors.forEach(context.install);
61477           keybinding
61478               .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
61479               .on('⎋', esc, true);
61480
61481           select(document)
61482               .call(keybinding);
61483
61484           selectError();
61485
61486           var sidebar = context.ui().sidebar;
61487           sidebar.show(errorEditor.error(error));
61488
61489           context.map()
61490               .on('drawn.select-error', selectError);
61491
61492
61493           // class the error as selected, or return to browse mode if the error is gone
61494           function selectError(drawn) {
61495               if (!checkSelectedID()) return;
61496
61497               var selection = context.surface()
61498                   .selectAll('.error_id-' + selectedErrorID + '.' + selectedErrorService);
61499
61500               if (selection.empty()) {
61501                   // Return to browse mode if selected DOM elements have
61502                   // disappeared because the user moved them out of view..
61503                   var source = event && event.type === 'zoom' && event.sourceEvent;
61504                   if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
61505                       context.enter(modeBrowse(context));
61506                   }
61507
61508               } else {
61509                   selection
61510                       .classed('selected', true);
61511
61512                   context.selectedErrorID(selectedErrorID);
61513               }
61514           }
61515
61516           function esc() {
61517               if (select('.combobox').size()) return;
61518               context.enter(modeBrowse(context));
61519           }
61520       };
61521
61522
61523       mode.exit = function() {
61524           behaviors.forEach(context.uninstall);
61525
61526           select(document)
61527               .call(keybinding.unbind);
61528
61529           context.surface()
61530               .selectAll('.qa_error.selected')
61531               .classed('selected hover', false);
61532
61533           context.map()
61534               .on('drawn.select-error', null);
61535
61536           context.ui().sidebar
61537               .hide();
61538
61539           context.selectedErrorID(null);
61540           context.features().forceVisible([]);
61541       };
61542
61543
61544       return mode;
61545   }
61546
61547   function modeSelectNote(context, selectedNoteID) {
61548       var mode = {
61549           id: 'select-note',
61550           button: 'browse'
61551       };
61552
61553       var osm = services.osm;
61554       var keybinding = utilKeybinding('select-note');
61555       var noteEditor = uiNoteEditor(context)
61556           .on('change', function() {
61557               context.map().pan([0,0]);  // trigger a redraw
61558               var note = checkSelectedID();
61559               if (!note) return;
61560               context.ui().sidebar
61561                   .show(noteEditor.note(note));
61562           });
61563
61564       var behaviors = [
61565           behaviorBreathe(context),
61566           behaviorHover(context),
61567           behaviorSelect(context),
61568           behaviorLasso(context),
61569           modeDragNode(context).behavior,
61570           modeDragNote(context).behavior
61571       ];
61572
61573       var newFeature = false;
61574
61575
61576       function checkSelectedID() {
61577           if (!osm) return;
61578           var note = osm.getNote(selectedNoteID);
61579           if (!note) {
61580               context.enter(modeBrowse(context));
61581           }
61582           return note;
61583       }
61584
61585
61586       // class the note as selected, or return to browse mode if the note is gone
61587       function selectNote(drawn) {
61588           if (!checkSelectedID()) return;
61589
61590           var selection = context.surface().selectAll('.layer-notes .note-' + selectedNoteID);
61591
61592           if (selection.empty()) {
61593               // Return to browse mode if selected DOM elements have
61594               // disappeared because the user moved them out of view..
61595               var source = event && event.type === 'zoom' && event.sourceEvent;
61596               if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
61597                   context.enter(modeBrowse(context));
61598               }
61599
61600           } else {
61601               selection
61602                   .classed('selected', true);
61603
61604               context.selectedNoteID(selectedNoteID);
61605           }
61606       }
61607
61608
61609       function esc() {
61610           if (select('.combobox').size()) return;
61611           context.enter(modeBrowse(context));
61612       }
61613
61614
61615       mode.zoomToSelected = function() {
61616           if (!osm) return;
61617           var note = osm.getNote(selectedNoteID);
61618           if (note) {
61619               context.map().centerZoomEase(note.loc, 20);
61620           }
61621       };
61622
61623
61624       mode.newFeature = function(val) {
61625           if (!arguments.length) return newFeature;
61626           newFeature = val;
61627           return mode;
61628       };
61629
61630
61631       mode.enter = function() {
61632           var note = checkSelectedID();
61633           if (!note) return;
61634
61635           behaviors.forEach(context.install);
61636
61637           keybinding
61638               .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
61639               .on('⎋', esc, true);
61640
61641           select(document)
61642               .call(keybinding);
61643
61644           selectNote();
61645
61646           var sidebar = context.ui().sidebar;
61647           sidebar.show(noteEditor.note(note));
61648
61649           // expand the sidebar, avoid obscuring the note if needed
61650           sidebar.expand(sidebar.intersects(note.extent()));
61651
61652           context.map()
61653               .on('drawn.select', selectNote);
61654       };
61655
61656
61657       mode.exit = function() {
61658           behaviors.forEach(context.uninstall);
61659
61660           select(document)
61661               .call(keybinding.unbind);
61662
61663           context.surface()
61664               .selectAll('.layer-notes .selected')
61665               .classed('selected hover', false);
61666
61667           context.map()
61668               .on('drawn.select', null);
61669
61670           context.ui().sidebar
61671               .hide();
61672
61673           context.selectedNoteID(null);
61674       };
61675
61676
61677       return mode;
61678   }
61679
61680   function behaviorAddWay(context) {
61681       var dispatch$1 = dispatch('start', 'startFromWay', 'startFromNode');
61682       var draw = behaviorDraw(context);
61683
61684       function behavior(surface) {
61685           draw.on('click', function() { dispatch$1.apply('start', this, arguments); })
61686               .on('clickWay', function() { dispatch$1.apply('startFromWay', this, arguments); })
61687               .on('clickNode', function() { dispatch$1.apply('startFromNode', this, arguments); })
61688               .on('cancel', behavior.cancel)
61689               .on('finish', behavior.cancel);
61690
61691           context.map()
61692               .dblclickEnable(false);
61693
61694           surface.call(draw);
61695       }
61696
61697
61698       behavior.off = function(surface) {
61699           surface.call(draw.off);
61700       };
61701
61702
61703       behavior.cancel = function() {
61704           window.setTimeout(function() {
61705               context.map().dblclickEnable(true);
61706           }, 1000);
61707
61708           context.enter(modeBrowse(context));
61709       };
61710
61711
61712       behavior.tail = function(text) {
61713           draw.tail(text);
61714           return behavior;
61715       };
61716
61717
61718       return utilRebind(behavior, dispatch$1, 'on');
61719   }
61720
61721   function behaviorBreathe() {
61722       var duration = 800;
61723       var steps = 4;
61724       var selector = '.selected.shadow, .selected .shadow';
61725       var _selected = select(null);
61726       var _classed = '';
61727       var _params = {};
61728       var _done = false;
61729       var _timer;
61730
61731
61732       function ratchetyInterpolator(a, b, steps, units) {
61733           a = parseFloat(a);
61734           b = parseFloat(b);
61735           var sample = quantize()
61736               .domain([0, 1])
61737               .range(d3_quantize(interpolateNumber(a, b), steps));
61738
61739           return function(t) {
61740               return String(sample(t)) + (units || '');
61741           };
61742       }
61743
61744
61745       function reset(selection) {
61746           selection
61747               .style('stroke-opacity', null)
61748               .style('stroke-width', null)
61749               .style('fill-opacity', null)
61750               .style('r', null);
61751       }
61752
61753
61754       function setAnimationParams(transition, fromTo) {
61755           var toFrom = (fromTo === 'from' ? 'to' : 'from');
61756
61757           transition
61758               .styleTween('stroke-opacity', function(d) {
61759                   return ratchetyInterpolator(
61760                       _params[d.id][toFrom].opacity,
61761                       _params[d.id][fromTo].opacity,
61762                       steps
61763                   );
61764               })
61765               .styleTween('stroke-width', function(d) {
61766                   return ratchetyInterpolator(
61767                       _params[d.id][toFrom].width,
61768                       _params[d.id][fromTo].width,
61769                       steps,
61770                       'px'
61771                   );
61772               })
61773               .styleTween('fill-opacity', function(d) {
61774                   return ratchetyInterpolator(
61775                       _params[d.id][toFrom].opacity,
61776                       _params[d.id][fromTo].opacity,
61777                       steps
61778                   );
61779               })
61780               .styleTween('r', function(d) {
61781                   return ratchetyInterpolator(
61782                       _params[d.id][toFrom].width,
61783                       _params[d.id][fromTo].width,
61784                       steps,
61785                       'px'
61786                   );
61787               });
61788       }
61789
61790
61791       function calcAnimationParams(selection) {
61792           selection
61793               .call(reset)
61794               .each(function(d) {
61795                   var s = select(this);
61796                   var tag = s.node().tagName;
61797                   var p = {'from': {}, 'to': {}};
61798                   var opacity;
61799                   var width;
61800
61801                   // determine base opacity and width
61802                   if (tag === 'circle') {
61803                       opacity = parseFloat(s.style('fill-opacity') || 0.5);
61804                       width = parseFloat(s.style('r') || 15.5);
61805                   } else {
61806                       opacity = parseFloat(s.style('stroke-opacity') || 0.7);
61807                       width = parseFloat(s.style('stroke-width') || 10);
61808                   }
61809
61810                   // calculate from/to interpolation params..
61811                   p.tag = tag;
61812                   p.from.opacity = opacity * 0.6;
61813                   p.to.opacity = opacity * 1.25;
61814                   p.from.width = width * 0.7;
61815                   p.to.width = width * (tag === 'circle' ? 1.5 : 1);
61816                   _params[d.id] = p;
61817               });
61818       }
61819
61820
61821       function run(surface, fromTo) {
61822           var toFrom = (fromTo === 'from' ? 'to' : 'from');
61823           var currSelected = surface.selectAll(selector);
61824           var currClassed = surface.attr('class');
61825
61826           if (_done || currSelected.empty()) {
61827               _selected.call(reset);
61828               return;
61829           }
61830
61831           if (!isEqual(currSelected.data(), _selected.data()) || currClassed !== _classed) {
61832               _selected.call(reset);
61833               _classed = currClassed;
61834               _selected = currSelected.call(calcAnimationParams);
61835           }
61836
61837           _selected
61838               .transition()
61839               .duration(duration)
61840               .call(setAnimationParams, fromTo)
61841               .on('end', function() {
61842                   surface.call(run, toFrom);
61843               });
61844       }
61845
61846
61847       function behavior(surface) {
61848           _done = false;
61849           _timer = timer(function() {
61850               // wait for elements to actually become selected
61851               if (surface.selectAll(selector).empty()) {
61852                   return false;
61853               }
61854
61855               surface.call(run, 'from');
61856               _timer.stop();
61857               return true;
61858           }, 20);
61859       }
61860
61861
61862       behavior.off = function() {
61863           _done = true;
61864           if (_timer) {
61865               _timer.stop();
61866           }
61867           _selected
61868               .interrupt()
61869               .call(reset);
61870       };
61871
61872
61873       return behavior;
61874   }
61875
61876   function behaviorCopy(context) {
61877
61878       function groupEntities(ids, graph) {
61879           var entities = ids.map(function (id) { return graph.entity(id); });
61880           return assignIn({relation: [], way: [], node: []},
61881               groupBy(entities, function(entity) { return entity.type; }));
61882       }
61883
61884
61885       function getDescendants(id, graph, descendants) {
61886           var entity = graph.entity(id);
61887           var children;
61888
61889           descendants = descendants || {};
61890
61891           if (entity.type === 'relation') {
61892               children = map$3(entity.members, 'id');
61893           } else if (entity.type === 'way') {
61894               children = entity.nodes;
61895           } else {
61896               children = [];
61897           }
61898
61899           for (var i = 0; i < children.length; i++) {
61900               if (!descendants[children[i]]) {
61901                   descendants[children[i]] = true;
61902                   descendants = getDescendants(children[i], graph, descendants);
61903               }
61904           }
61905
61906           return descendants;
61907       }
61908
61909
61910       function getSelectionText() {
61911           return window.getSelection().toString();
61912       }
61913
61914
61915       function doCopy() {
61916           if (!getSelectionText()) {
61917               event.preventDefault();
61918           }
61919
61920           var graph = context.graph();
61921           var selected = groupEntities(context.selectedIDs(), graph);
61922           var canCopy = [];
61923           var skip = {};
61924           var entity;
61925           var i;
61926
61927           for (i = 0; i < selected.relation.length; i++) {
61928               entity = selected.relation[i];
61929               if (!skip[entity.id] && entity.isComplete(graph)) {
61930                   canCopy.push(entity.id);
61931                   skip = getDescendants(entity.id, graph, skip);
61932               }
61933           }
61934           for (i = 0; i < selected.way.length; i++) {
61935               entity = selected.way[i];
61936               if (!skip[entity.id]) {
61937                   canCopy.push(entity.id);
61938                   skip = getDescendants(entity.id, graph, skip);
61939               }
61940           }
61941           for (i = 0; i < selected.node.length; i++) {
61942               entity = selected.node[i];
61943               if (!skip[entity.id]) {
61944                   canCopy.push(entity.id);
61945               }
61946           }
61947
61948           context.copyIDs(canCopy);
61949       }
61950
61951
61952       function behavior() {
61953           context.keybinding().on(uiCmd('⌘C'), doCopy);
61954           return behavior;
61955       }
61956
61957       behavior.off = function() {
61958           context.keybinding().off(uiCmd('⌘C'));
61959       };
61960
61961
61962       return behavior;
61963   }
61964
61965   /*
61966       `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
61967
61968       * The `origin` function is expected to return an [x, y] tuple rather than an
61969         {x, y} object.
61970       * The events are `start`, `move`, and `end`.
61971         (https://github.com/mbostock/d3/issues/563)
61972       * The `start` event is not dispatched until the first cursor movement occurs.
61973         (https://github.com/mbostock/d3/pull/368)
61974       * The `move` event has a `point` and `delta` [x, y] tuple properties rather
61975         than `x`, `y`, `dx`, and `dy` properties.
61976       * The `end` event is not dispatched if no movement occurs.
61977       * An `off` function is available that unbinds the drag's internal event handlers.
61978    */
61979
61980   function behaviorDrag() {
61981       var dispatch$1 = dispatch('start', 'move', 'end');
61982       var _origin = null;
61983       var _selector = '';
61984       var _event;
61985       var _target;
61986       var _surface;
61987
61988
61989       var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect');
61990       var d3_event_userSelectSuppress = function() {
61991               var selection$1 = selection();
61992               var select = selection$1.style(d3_event_userSelectProperty);
61993               selection$1.style(d3_event_userSelectProperty, 'none');
61994               return function() {
61995                   selection$1.style(d3_event_userSelectProperty, select);
61996               };
61997           };
61998
61999
62000       function d3_eventCancel() {
62001           event.stopPropagation();
62002           event.preventDefault();
62003       }
62004
62005
62006       function eventOf(thiz, argumentz) {
62007           return function(e1) {
62008               e1.target = behavior;
62009               customEvent(e1, dispatch$1.apply, dispatch$1, [e1.type, thiz, argumentz]);
62010           };
62011       }
62012
62013
62014       function dragstart() {
62015           _target = this;
62016           _event = eventOf(_target, arguments);
62017
62018           var eventTarget = event.target;
62019           var touchId = event.touches ? event.changedTouches[0].identifier : null;
62020           var offset;
62021           var startOrigin = point();
62022           var started = false;
62023           var selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
62024
62025           select(window)
62026               .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
62027               .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
62028
62029           if (_origin) {
62030               offset = _origin.apply(_target, arguments);
62031               offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
62032           } else {
62033               offset = [0, 0];
62034           }
62035
62036           if (touchId === null) {
62037               event.stopPropagation();
62038           }
62039
62040
62041           function point() {
62042               var p = _surface || _target.parentNode;
62043               return touchId !== null ? d3_touches(p).filter(function(p) {
62044                   return p.identifier === touchId;
62045               })[0] : mouse(p);
62046           }
62047
62048
62049           function dragmove() {
62050               var p = point();
62051               var dx = p[0] - startOrigin[0];
62052               var dy = p[1] - startOrigin[1];
62053
62054               if (dx === 0 && dy === 0)
62055                   return;
62056
62057               startOrigin = p;
62058               d3_eventCancel();
62059
62060               if (!started) {
62061                   started = true;
62062                   _event({ type: 'start' });
62063               } else {
62064                   _event({
62065                       type: 'move',
62066                       point: [p[0] + offset[0],  p[1] + offset[1]],
62067                       delta: [dx, dy]
62068                   });
62069               }
62070           }
62071
62072
62073           function dragend() {
62074               if (started) {
62075                   _event({ type: 'end' });
62076
62077                   d3_eventCancel();
62078                   if (event.target === eventTarget) {
62079                       select(window)
62080                           .on('click.drag', click, true);
62081                   }
62082               }
62083
62084               select(window)
62085                   .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
62086                   .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
62087
62088               selectEnable();
62089           }
62090
62091
62092           function click() {
62093               d3_eventCancel();
62094               select(window)
62095                   .on('click.drag', null);
62096           }
62097       }
62098
62099
62100       function behavior(selection) {
62101           var matchesSelector = utilPrefixDOMProperty('matchesSelector');
62102           var delegate = dragstart;
62103
62104           if (_selector) {
62105               delegate = function() {
62106                   var root = this;
62107                   var target = event.target;
62108                   for (; target && target !== root; target = target.parentNode) {
62109                       var datum = target.__data__;
62110
62111                       var entity = datum instanceof osmNote ? datum
62112                           : datum && datum.properties && datum.properties.entity;
62113
62114                       if (entity && target[matchesSelector](_selector)) {
62115                           return dragstart.call(target, entity);
62116                       }
62117                   }
62118               };
62119           }
62120
62121           selection
62122               .on('mousedown.drag' + _selector, delegate)
62123               .on('touchstart.drag' + _selector, delegate);
62124       }
62125
62126
62127       behavior.off = function(selection) {
62128           selection
62129               .on('mousedown.drag' + _selector, null)
62130               .on('touchstart.drag' + _selector, null);
62131       };
62132
62133
62134       behavior.selector = function(_) {
62135           if (!arguments.length) return _selector;
62136           _selector = _;
62137           return behavior;
62138       };
62139
62140
62141       behavior.origin = function(_) {
62142           if (!arguments.length) return _origin;
62143           _origin = _;
62144           return behavior;
62145       };
62146
62147
62148       behavior.cancel = function() {
62149           select(window)
62150               .on('mousemove.drag', null)
62151               .on('mouseup.drag', null);
62152           return behavior;
62153       };
62154
62155
62156       behavior.target = function() {
62157           if (!arguments.length) return _target;
62158           _target = arguments[0];
62159           _event = eventOf(_target, Array.prototype.slice.call(arguments, 1));
62160           return behavior;
62161       };
62162
62163
62164       behavior.surface = function() {
62165           if (!arguments.length) return _surface;
62166           _surface = arguments[0];
62167           return behavior;
62168       };
62169
62170
62171       return utilRebind(behavior, dispatch$1, 'on');
62172   }
62173
62174   function behaviorDrawWay(context, wayID, index, mode, startGraph, baselineGraph) {
62175
62176       var origWay = context.entity(wayID);
62177
62178       var annotation = t((origWay.isDegenerate() ?
62179           'operations.start.annotation.' :
62180           'operations.continue.annotation.') + context.geometry(wayID)
62181       );
62182
62183       var behavior = behaviorDraw(context);
62184       behavior.hover().initialNodeId(index ? origWay.nodes[index] : origWay.nodes[origWay.nodes.length - 1]);
62185
62186       var _tempEdits = 0;
62187
62188       var end = osmNode({ loc: context.map().mouseCoordinates() });
62189
62190       // Push an annotated state for undo to return back to.
62191       // We must make sure to remove this edit later.
62192       context.perform(actionNoop(), annotation);
62193       _tempEdits++;
62194
62195       // Add the drawing node to the graph.
62196       // We must make sure to remove this edit later.
62197       context.perform(_actionAddDrawNode());
62198       _tempEdits++;
62199
62200
62201       function keydown() {
62202           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
62203               if (context.surface().classed('nope')) {
62204                   context.surface()
62205                       .classed('nope-suppressed', true);
62206               }
62207               context.surface()
62208                   .classed('nope', false)
62209                   .classed('nope-disabled', true);
62210           }
62211       }
62212
62213
62214       function keyup() {
62215           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
62216               if (context.surface().classed('nope-suppressed')) {
62217                   context.surface()
62218                       .classed('nope', true);
62219               }
62220               context.surface()
62221                   .classed('nope-suppressed', false)
62222                   .classed('nope-disabled', false);
62223           }
62224       }
62225
62226
62227       function allowsVertex(d) {
62228           return context.presets().allowsVertex(d, context.graph());
62229       }
62230
62231
62232       // related code
62233       // - `mode/drag_node.js`     `doMode()`
62234       // - `behavior/draw.js`      `click()`
62235       // - `behavior/draw_way.js`  `move()`
62236       function move(datum) {
62237           context.surface().classed('nope-disabled', event.altKey);
62238
62239           var targetLoc = datum && datum.properties && datum.properties.entity && allowsVertex(datum.properties.entity) && datum.properties.entity.loc;
62240           var targetNodes = datum && datum.properties && datum.properties.nodes;
62241           var loc = context.map().mouseCoordinates();
62242
62243           if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
62244               loc = targetLoc;
62245
62246           } else if (targetNodes) {   // snap to way - a line target with `.nodes`
62247               var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
62248               if (choice) {
62249                   loc = choice.loc;
62250               }
62251           }
62252
62253           context.replace(actionMoveNode(end.id, loc));
62254           end = context.entity(end.id);
62255           checkGeometry(false);
62256       }
62257
62258
62259       // Check whether this edit causes the geometry to break.
62260       // If so, class the surface with a nope cursor.
62261       // `finishDraw` - Only checks the relevant line segments if finishing drawing
62262       function checkGeometry(finishDraw) {
62263           var nopeDisabled = context.surface().classed('nope-disabled');
62264           var isInvalid = isInvalidGeometry(end, context.graph(), finishDraw);
62265
62266           if (nopeDisabled) {
62267               context.surface()
62268                   .classed('nope', false)
62269                   .classed('nope-suppressed', isInvalid);
62270           } else {
62271               context.surface()
62272                   .classed('nope', isInvalid)
62273                   .classed('nope-suppressed', false);
62274           }
62275       }
62276
62277
62278       function isInvalidGeometry(entity, graph, finishDraw) {
62279           var parents = graph.parentWays(entity);
62280
62281           for (var i = 0; i < parents.length; i++) {
62282               var parent = parents[i];
62283
62284               var nodes = graph.childNodes(parent);
62285
62286               if (origWay.isClosed()) { // Check if Area
62287                   if (finishDraw) {
62288                       nodes.splice(-2, 1);
62289                       entity = nodes[nodes.length-2];
62290                   } else {
62291                       nodes.pop();
62292                   }
62293               } else { // Line
62294                   if (finishDraw) {
62295                       nodes.pop();
62296                   }
62297               }
62298
62299               if (geoHasSelfIntersections(nodes, entity.id)) {
62300                   return true;
62301               }
62302           }
62303
62304           return false;
62305       }
62306
62307
62308       function undone() {
62309           // Undo popped the history back to the initial annotated no-op edit.
62310           _tempEdits = 0;     // We will deal with the temp edits here
62311           context.pop(1);     // Remove initial no-op edit
62312
62313           if (context.graph() === baselineGraph) {    // We've undone back to the beginning
62314               // baselineGraph may be behind startGraph if this way was added rather than continued
62315               while (context.graph() !== startGraph) {
62316                   context.pop();
62317               }
62318               context.enter(modeSelect(context, [wayID]));
62319           } else {
62320               // Remove whatever segment was drawn previously and continue drawing
62321               context.pop(1);
62322               context.enter(mode);
62323           }
62324       }
62325
62326
62327       function setActiveElements() {
62328           context.surface().selectAll('.' + end.id)
62329               .classed('active', true);
62330       }
62331
62332
62333       var drawWay = function(surface) {
62334           behavior
62335               .on('move', move)
62336               .on('click', drawWay.add)
62337               .on('clickWay', drawWay.addWay)
62338               .on('clickNode', drawWay.addNode)
62339               .on('undo', context.undo)
62340               .on('cancel', drawWay.cancel)
62341               .on('finish', drawWay.finish);
62342
62343           select(window)
62344               .on('keydown.drawWay', keydown)
62345               .on('keyup.drawWay', keyup);
62346
62347           context.map()
62348               .dblclickEnable(false)
62349               .on('drawn.draw', setActiveElements);
62350
62351           setActiveElements();
62352
62353           surface.call(behavior);
62354
62355           context.history()
62356               .on('undone.draw', undone);
62357       };
62358
62359
62360       drawWay.off = function(surface) {
62361           // Drawing was interrupted unexpectedly.
62362           // This can happen if the user changes modes,
62363           // clicks geolocate button, a hashchange event occurs, etc.
62364           if (_tempEdits) {
62365               context.history().reset('drawWay-initial');
62366           }
62367
62368           context.map()
62369               .on('drawn.draw', null);
62370
62371           surface.call(behavior.off)
62372               .selectAll('.active')
62373               .classed('active', false);
62374
62375           surface
62376               .classed('nope', false)
62377               .classed('nope-suppressed', false)
62378               .classed('nope-disabled', false);
62379
62380           select(window)
62381               .on('keydown.hover', null)
62382               .on('keyup.hover', null);
62383
62384           context.history()
62385               .on('undone.draw', null);
62386       };
62387
62388
62389       function _actionAddDrawNode() {
62390           return function(graph) {
62391               return graph
62392                   .replace(end)
62393                   .replace(origWay.addNode(end.id, index));
62394           };
62395       }
62396
62397
62398       function _actionReplaceDrawNode(newNode) {
62399           return function(graph) {
62400               return graph
62401                   .replace(origWay.addNode(newNode.id, index))
62402                   .remove(end);
62403           };
62404       }
62405
62406
62407       // Accept the current position of the drawing node and continue drawing.
62408       drawWay.add = function(loc, d) {
62409           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
62410               return;   // can't click here
62411           }
62412
62413           context.pop(_tempEdits);
62414           _tempEdits = 0;
62415
62416           context.perform(
62417               _actionAddDrawNode(),
62418               annotation
62419           );
62420
62421           checkGeometry(false);   // finishDraw = false
62422           context.enter(mode);
62423       };
62424
62425
62426       // Connect the way to an existing way.
62427       drawWay.addWay = function(loc, edge, d) {
62428           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
62429               return;   // can't click here
62430           }
62431
62432           context.pop(_tempEdits);
62433           _tempEdits = 0;
62434
62435           context.perform(
62436               _actionAddDrawNode(),
62437               actionAddMidpoint({ loc: loc, edge: edge }, end),
62438               annotation
62439           );
62440
62441           checkGeometry(false);   // finishDraw = false
62442           context.enter(mode);
62443       };
62444
62445
62446       // Connect the way to an existing node and continue drawing.
62447       drawWay.addNode = function(node, d) {
62448           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
62449               return;   // can't click here
62450           }
62451
62452           context.pop(_tempEdits);
62453           _tempEdits = 0;
62454
62455           context.perform(
62456               _actionReplaceDrawNode(node),
62457               annotation
62458           );
62459
62460           checkGeometry(false);   // finishDraw = false
62461           context.enter(mode);
62462       };
62463
62464
62465       // Finish the draw operation, removing the temporary edits.
62466       // If the way has enough nodes to be valid, it's selected.
62467       // Otherwise, delete everything and return to browse mode.
62468       drawWay.finish = function() {
62469           checkGeometry(true);   // finishDraw = true
62470           if (context.surface().classed('nope')) {
62471               return;   // can't click here
62472           }
62473
62474           context.pop(_tempEdits);
62475           _tempEdits = 0;
62476
62477           var way = context.hasEntity(wayID);
62478           if (!way || way.isDegenerate()) {
62479               drawWay.cancel();
62480               return;
62481           }
62482
62483           window.setTimeout(function() {
62484               context.map().dblclickEnable(true);
62485           }, 1000);
62486           var isNewFeature = !mode.isContinuing;
62487           context.enter(modeSelect(context, [wayID]).newFeature(isNewFeature));
62488       };
62489
62490
62491       // Cancel the draw operation, delete everything, and return to browse mode.
62492       drawWay.cancel = function() {
62493           context.pop(_tempEdits);
62494           _tempEdits = 0;
62495
62496           while (context.graph() !== startGraph) {
62497               context.pop();
62498           }
62499
62500           window.setTimeout(function() {
62501               context.map().dblclickEnable(true);
62502           }, 1000);
62503
62504           context.surface()
62505               .classed('nope', false)
62506               .classed('nope-disabled', false)
62507               .classed('nope-suppressed', false);
62508
62509           context.enter(modeBrowse(context));
62510       };
62511
62512
62513       drawWay.activeID = function() {
62514           if (!arguments.length) return end.id;
62515           // no assign
62516           return drawWay;
62517       };
62518
62519
62520       drawWay.tail = function(text) {
62521           behavior.tail(text);
62522           return drawWay;
62523       };
62524
62525
62526       return drawWay;
62527   }
62528
62529   function behaviorHash(context) {
62530       var s0 = null; // cached window.location.hash
62531       var lat = 90 - 1e-8; // allowable latitude range
62532
62533
62534       var parser = function(map, s) {
62535           var q = utilStringQs(s);
62536           var args = (q.map || '').split('/').map(Number);
62537
62538           if (args.length < 3 || args.some(isNaN)) {
62539               return true; // replace bogus hash
62540
62541           } else if (s !== formatter(map).slice(1)) {   // hash has changed
62542               var mode = context.mode(),
62543                   dist = geoSphericalDistance(map.center(), [args[2], args[1]]),
62544                   maxdist = 500;
62545
62546               // Don't allow the hash location to change too much while drawing
62547               // This can happen if the user accidently hit the back button.  #3996
62548               if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
62549                   context.enter(modeBrowse(context));
62550               }
62551
62552               map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
62553           }
62554       };
62555
62556
62557       var formatter = function(map) {
62558           var center = map.center();
62559           var zoom = map.zoom();
62560           var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
62561           var q = omit(utilStringQs(window.location.hash.substring(1)),
62562               ['comment', 'source', 'hashtags', 'walkthrough']
62563           );
62564           var newParams = {};
62565
62566           delete q.id;
62567           var selected = context.selectedIDs().filter(function(id) {
62568               return !context.entity(id).isNew();
62569           });
62570           if (selected.length) {
62571               newParams.id = selected.join(',');
62572           }
62573
62574           newParams.map = zoom.toFixed(2) +
62575               '/' + center[1].toFixed(precision) +
62576               '/' + center[0].toFixed(precision);
62577
62578           return '#' + utilQsString(assign(q, newParams), true);
62579       };
62580
62581
62582       function update() {
62583           if (context.inIntro()) return;
62584           var s1 = formatter(context.map());
62585           if (s0 !== s1) {
62586               window.location.replace(s0 = s1);  // don't recenter the map!
62587           }
62588       }
62589
62590
62591       var throttledUpdate = throttle(update, 500);
62592
62593
62594       function hashchange() {
62595           if (window.location.hash === s0) return;  // ignore spurious hashchange events
62596           if (parser(context.map(), (s0 = window.location.hash).substring(1))) {
62597               update(); // replace bogus hash
62598           }
62599       }
62600
62601
62602       function behavior() {
62603           context.map()
62604               .on('move.hash', throttledUpdate);
62605
62606           context
62607               .on('enter.hash', throttledUpdate);
62608
62609           select(window)
62610               .on('hashchange.hash', hashchange);
62611
62612           if (window.location.hash) {
62613               var q = utilStringQs(window.location.hash.substring(1));
62614
62615               if (q.id) {
62616                   context.zoomToEntity(q.id.split(',')[0], !q.map);
62617               }
62618
62619               if (q.comment) {
62620                   context.storage('comment', q.comment);
62621                   context.storage('commentDate', Date.now());
62622               }
62623
62624               if (q.source) {
62625                   context.storage('source', q.source);
62626                   context.storage('commentDate', Date.now());
62627               }
62628
62629               if (q.hashtags) {
62630                   context.storage('hashtags', q.hashtags);
62631               }
62632
62633               if (q.walkthrough === 'true') {
62634                   behavior.startWalkthrough = true;
62635               }
62636
62637               hashchange();
62638
62639               if (q.map) {
62640                   behavior.hadHash = true;
62641               }
62642           }
62643       }
62644
62645
62646       behavior.off = function() {
62647           throttledUpdate.cancel();
62648
62649           context.map()
62650               .on('move.hash', null);
62651
62652           context
62653               .on('enter.hash', null);
62654
62655           select(window)
62656               .on('hashchange.hash', null);
62657
62658           window.location.hash = '';
62659       };
62660
62661
62662       return behavior;
62663   }
62664
62665   function behaviorLasso(context) {
62666
62667       var behavior = function(selection) {
62668           var lasso;
62669
62670
62671           function mousedown() {
62672               var button = 0;  // left
62673               if (event.button === button && event.shiftKey === true) {
62674                   lasso = null;
62675
62676                   select(window)
62677                       .on('mousemove.lasso', mousemove)
62678                       .on('mouseup.lasso', mouseup);
62679
62680                   event.stopPropagation();
62681               }
62682           }
62683
62684
62685           function mousemove() {
62686               if (!lasso) {
62687                   lasso = uiLasso(context);
62688                   context.surface().call(lasso);
62689               }
62690
62691               lasso.p(context.mouse());
62692           }
62693
62694
62695           function normalize(a, b) {
62696               return [
62697                   [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
62698                   [Math.max(a[0], b[0]), Math.max(a[1], b[1])]];
62699           }
62700
62701
62702           function lassoed() {
62703               if (!lasso) return [];
62704
62705               var graph = context.graph();
62706               var bounds = lasso.extent().map(context.projection.invert);
62707               var extent = geoExtent(normalize(bounds[0], bounds[1]));
62708
62709               return map$3(context.intersects(extent).filter(function(entity) {
62710                   return entity.type === 'node' &&
62711                       geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) &&
62712                       !context.features().isHidden(entity, graph, entity.geometry(graph));
62713               }), 'id');
62714           }
62715
62716
62717           function mouseup() {
62718               select(window)
62719                   .on('mousemove.lasso', null)
62720                   .on('mouseup.lasso', null);
62721
62722               if (!lasso) return;
62723
62724               var ids = lassoed();
62725               lasso.close();
62726
62727               if (ids.length) {
62728                   context.enter(modeSelect(context, ids));
62729               }
62730           }
62731
62732           selection
62733               .on('mousedown.lasso', mousedown);
62734       };
62735
62736
62737       behavior.off = function(selection) {
62738           selection.on('mousedown.lasso', null);
62739       };
62740
62741
62742       return behavior;
62743   }
62744
62745   /* Creates a keybinding behavior for an operation */
62746   function behaviorOperation(context) {
62747       var _operation;
62748
62749       function keypress() {
62750           event.preventDefault();
62751           var disabled = _operation.disabled();
62752           var flash;
62753
62754           if (disabled) {
62755               flash = uiFlash()
62756                   .duration(4000)
62757                   .iconName('#iD-operation-' + _operation.id)
62758                   .iconClass('operation disabled')
62759                   .text(_operation.tooltip);
62760
62761               flash();
62762
62763           } else {
62764               flash = uiFlash()
62765                   .duration(2000)
62766                   .iconName('#iD-operation-' + _operation.id)
62767                   .iconClass('operation')
62768                   .text(_operation.annotation() || _operation.title);
62769
62770               flash();
62771               _operation();
62772           }
62773       }
62774
62775
62776       function behavior() {
62777           if (_operation && _operation.available()) {
62778               context.keybinding()
62779                   .on(_operation.keys, keypress);
62780           }
62781
62782           return behavior;
62783       }
62784
62785
62786       behavior.off = function() {
62787           context.keybinding()
62788               .off(_operation.keys);
62789       };
62790
62791
62792       behavior.which = function (_) {
62793           if (!arguments.length) return _operation;
62794           _operation = _;
62795           return behavior;
62796       };
62797
62798
62799       return behavior;
62800   }
62801
62802   /**
62803    * The base implementation of `_.invert` and `_.invertBy` which inverts
62804    * `object` with values transformed by `iteratee` and set by `setter`.
62805    *
62806    * @private
62807    * @param {Object} object The object to iterate over.
62808    * @param {Function} setter The function to set `accumulator` values.
62809    * @param {Function} iteratee The iteratee to transform values.
62810    * @param {Object} accumulator The initial inverted object.
62811    * @returns {Function} Returns `accumulator`.
62812    */
62813   function baseInverter(object, setter, iteratee, accumulator) {
62814     baseForOwn(object, function(value, key, object) {
62815       setter(accumulator, iteratee(value), key, object);
62816     });
62817     return accumulator;
62818   }
62819
62820   /**
62821    * Creates a function like `_.invertBy`.
62822    *
62823    * @private
62824    * @param {Function} setter The function to set accumulator values.
62825    * @param {Function} toIteratee The function to resolve iteratees.
62826    * @returns {Function} Returns the new inverter function.
62827    */
62828   function createInverter(setter, toIteratee) {
62829     return function(object, iteratee) {
62830       return baseInverter(object, setter, toIteratee(iteratee), {});
62831     };
62832   }
62833
62834   /** Used for built-in method references. */
62835   var objectProto$j = Object.prototype;
62836
62837   /**
62838    * Used to resolve the
62839    * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
62840    * of values.
62841    */
62842   var nativeObjectToString$2 = objectProto$j.toString;
62843
62844   /**
62845    * Creates an object composed of the inverted keys and values of `object`.
62846    * If `object` contains duplicate values, subsequent values overwrite
62847    * property assignments of previous values.
62848    *
62849    * @static
62850    * @memberOf _
62851    * @since 0.7.0
62852    * @category Object
62853    * @param {Object} object The object to invert.
62854    * @returns {Object} Returns the new inverted object.
62855    * @example
62856    *
62857    * var object = { 'a': 1, 'b': 2, 'c': 1 };
62858    *
62859    * _.invert(object);
62860    * // => { '1': 'c', '2': 'b' }
62861    */
62862   var invert = createInverter(function(result, value, key) {
62863     if (value != null &&
62864         typeof value.toString != 'function') {
62865       value = nativeObjectToString$2.call(value);
62866     }
62867
62868     result[value] = key;
62869   }, constant$d(identity$8));
62870
62871   /**
62872    * Creates an object with the same keys as `object` and values generated
62873    * by running each own enumerable string keyed property of `object` thru
62874    * `iteratee`. The iteratee is invoked with three arguments:
62875    * (value, key, object).
62876    *
62877    * @static
62878    * @memberOf _
62879    * @since 2.4.0
62880    * @category Object
62881    * @param {Object} object The object to iterate over.
62882    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
62883    * @returns {Object} Returns the new mapped object.
62884    * @see _.mapKeys
62885    * @example
62886    *
62887    * var users = {
62888    *   'fred':    { 'user': 'fred',    'age': 40 },
62889    *   'pebbles': { 'user': 'pebbles', 'age': 1 }
62890    * };
62891    *
62892    * _.mapValues(users, function(o) { return o.age; });
62893    * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
62894    *
62895    * // The `_.property` iteratee shorthand.
62896    * _.mapValues(users, 'age');
62897    * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
62898    */
62899   function mapValues(object, iteratee) {
62900     var result = {};
62901     iteratee = baseIteratee(iteratee, 3);
62902
62903     baseForOwn(object, function(value, key, object) {
62904       baseAssignValue(result, key, iteratee(value, key, object));
62905     });
62906     return result;
62907   }
62908
62909   function behaviorPaste(context) {
62910
62911       function doPaste() {
62912           event.preventDefault();
62913
62914           var baseGraph = context.graph();
62915           var mouse = context.mouse();
62916           var projection = context.projection;
62917           var viewport = geoExtent(projection.clipExtent()).polygon();
62918
62919           if (!geoPointInPolygon(mouse, viewport)) return;
62920
62921           var extent = geoExtent();
62922           var oldIDs = context.copyIDs();
62923           var oldGraph = context.copyGraph();
62924           var newIDs = [];
62925
62926           if (!oldIDs.length) return;
62927
62928           var action = actionCopyEntities(oldIDs, oldGraph);
62929           context.perform(action);
62930
62931           var copies = action.copies();
62932           var originals = invert(mapValues(copies, 'id'));
62933           for (var id in copies) {
62934               var oldEntity = oldGraph.entity(id);
62935               var newEntity = copies[id];
62936
62937               extent._extend(oldEntity.extent(oldGraph));
62938
62939               // Exclude child nodes from newIDs if their parent way was also copied.
62940               var parents = context.graph().parentWays(newEntity);
62941               var parentCopied = false;
62942               for (var i = 0; i < parents.length; i++) {
62943                   if (originals[parents[i].id]) {
62944                       parentCopied = true;
62945                       break;
62946                   }
62947               }
62948
62949               if (!parentCopied) {
62950                   newIDs.push(newEntity.id);
62951               }
62952           }
62953
62954           // Put pasted objects where mouse pointer is..
62955           var center = projection(extent.center());
62956           var delta = geoVecSubtract(mouse, center);
62957
62958           context.perform(actionMove(newIDs, delta, projection));
62959           context.enter(modeMove(context, newIDs, baseGraph));
62960       }
62961
62962
62963       function behavior() {
62964           context.keybinding().on(uiCmd('⌘V'), doPaste);
62965           return behavior;
62966       }
62967
62968
62969       behavior.off = function() {
62970           context.keybinding().off(uiCmd('⌘V'));
62971       };
62972
62973
62974       return behavior;
62975   }
62976
62977   function behaviorSelect(context) {
62978       var lastMouse = null;
62979       var suppressMenu = true;
62980       var tolerance = 4;
62981       var p1 = null;
62982
62983
62984       function point() {
62985           return mouse(context.container().node());
62986       }
62987
62988
62989       function keydown() {
62990           var e = event;
62991           if (e && e.shiftKey) {
62992               context.surface()
62993                   .classed('behavior-multiselect', true);
62994           }
62995
62996           if (e && e.keyCode === 93) {  // context menu
62997               e.preventDefault();
62998               e.stopPropagation();
62999           }
63000       }
63001
63002
63003       function keyup() {
63004           var e = event;
63005           if (!e || !e.shiftKey) {
63006               context.surface()
63007                   .classed('behavior-multiselect', false);
63008           }
63009
63010
63011           if (e && e.keyCode === 93) {  // context menu
63012               e.preventDefault();
63013               e.stopPropagation();
63014               contextmenu();
63015           }
63016       }
63017
63018
63019       function mousedown() {
63020           if (!p1) p1 = point();
63021           select(window)
63022               .on('mouseup.select', mouseup, true);
63023
63024           var isShowAlways = +context.storage('edit-menu-show-always') === 1;
63025           suppressMenu = !isShowAlways;
63026       }
63027
63028
63029       function mousemove() {
63030           if (event) lastMouse = event;
63031       }
63032
63033
63034       function mouseup() {
63035           click();
63036       }
63037
63038
63039       function contextmenu() {
63040           var e = event;
63041           e.preventDefault();
63042           e.stopPropagation();
63043
63044           if (!+e.clientX && !+e.clientY) {
63045               if (lastMouse) {
63046                   e.sourceEvent = lastMouse;
63047               } else {
63048                   return;
63049               }
63050           }
63051
63052           if (!p1) p1 = point();
63053           suppressMenu = false;
63054           click();
63055       }
63056
63057
63058       function click() {
63059           select(window)
63060               .on('mouseup.select', null, true);
63061
63062           if (!p1) return;
63063           var p2 = point();
63064           var dist = geoVecLength(p1, p2);
63065
63066           p1 = null;
63067           if (dist > tolerance) {
63068               return;
63069           }
63070
63071           var isMultiselect = event.shiftKey || select('#surface .lasso').node();
63072           var isShowAlways = +context.storage('edit-menu-show-always') === 1;
63073           var datum = event.target.__data__ || (lastMouse && lastMouse.target.__data__);
63074           var mode = context.mode();
63075
63076           var entity = datum && datum.properties && datum.properties.entity;
63077           if (entity) datum = entity;
63078
63079           if (datum && datum.type === 'midpoint') {
63080               datum = datum.parents[0];
63081           }
63082
63083           if (datum instanceof osmEntity) {    // clicked an entity..
63084               var selectedIDs = context.selectedIDs();
63085               context.selectedNoteID(null);
63086               context.selectedErrorID(null);
63087
63088               if (!isMultiselect) {
63089                   if (selectedIDs.length > 1 && (!suppressMenu && !isShowAlways)) {
63090                       // multiple things already selected, just show the menu...
63091                       mode.suppressMenu(false).reselect();
63092                   } else {
63093                       // select a single thing..
63094                       context.enter(modeSelect(context, [datum.id]).suppressMenu(suppressMenu));
63095                   }
63096
63097               } else {
63098                   if (selectedIDs.indexOf(datum.id) !== -1) {
63099                       // clicked entity is already in the selectedIDs list..
63100                       if (!suppressMenu && !isShowAlways) {
63101                           // don't deselect clicked entity, just show the menu.
63102                           mode.suppressMenu(false).reselect();
63103                       } else {
63104                           // deselect clicked entity, then reenter select mode or return to browse mode..
63105                           selectedIDs = without(selectedIDs, datum.id);
63106                           context.enter(selectedIDs.length ? modeSelect(context, selectedIDs) : modeBrowse(context));
63107                       }
63108                   } else {
63109                       // clicked entity is not in the selected list, add it..
63110                       selectedIDs = selectedIDs.concat([datum.id]);
63111                       context.enter(modeSelect(context, selectedIDs).suppressMenu(suppressMenu));
63112                   }
63113               }
63114
63115           } else if (datum && datum.__featurehash__ && !isMultiselect) {    // clicked Data..
63116               context
63117                   .selectedNoteID(null)
63118                   .enter(modeSelectData(context, datum));
63119
63120           } else if (datum instanceof osmNote && !isMultiselect) {    // clicked a Note..
63121               context
63122                   .selectedNoteID(datum.id)
63123                   .enter(modeSelectNote(context, datum.id));
63124           } else if (datum instanceof qaError & !isMultiselect) {  // clicked an external QA error
63125               context
63126                   .selectedErrorID(datum.id)
63127                   .enter(modeSelectError(context, datum.id, datum.service));
63128           } else {    // clicked nothing..
63129               context.selectedNoteID(null);
63130               context.selectedErrorID(null);
63131               if (!isMultiselect && mode.id !== 'browse') {
63132                   context.enter(modeBrowse(context));
63133               }
63134           }
63135
63136           // reset for next time..
63137           suppressMenu = true;
63138       }
63139
63140
63141       function behavior(selection) {
63142           lastMouse = null;
63143           suppressMenu = true;
63144           p1 = null;
63145
63146           select(window)
63147               .on('keydown.select', keydown)
63148               .on('keyup.select', keyup)
63149               .on('contextmenu.select-window', function() {
63150                   // Edge and IE really like to show the contextmenu on the
63151                   // menubar when user presses a keyboard menu button
63152                   // even after we've already preventdefaulted the key event.
63153                   var e = event;
63154                   if (+e.clientX === 0 && +e.clientY === 0) {
63155                       event.preventDefault();
63156                       event.stopPropagation();
63157                   }
63158               });
63159
63160           selection
63161               .on('mousedown.select', mousedown)
63162               .on('mousemove.select', mousemove)
63163               .on('contextmenu.select', contextmenu);
63164
63165           if (event && event.shiftKey) {
63166               context.surface()
63167                   .classed('behavior-multiselect', true);
63168           }
63169       }
63170
63171
63172       behavior.off = function(selection) {
63173           select(window)
63174               .on('keydown.select', null)
63175               .on('keyup.select', null)
63176               .on('contextmenu.select-window', null)
63177               .on('mouseup.select', null, true);
63178
63179           selection
63180               .on('mousedown.select', null)
63181               .on('mousemove.select', null)
63182               .on('contextmenu.select', null);
63183
63184           context.surface()
63185               .classed('behavior-multiselect', false);
63186       };
63187
63188
63189       return behavior;
63190   }
63191
63192   function uiAccount(context) {
63193       var osm = context.connection();
63194
63195
63196       function update(selection) {
63197           if (!osm) return;
63198
63199           if (!osm.authenticated()) {
63200               selection.selectAll('#userLink, #logoutLink')
63201                   .classed('hide', true);
63202               return;
63203           }
63204
63205           osm.userDetails(function(err, details) {
63206               var userLink = selection.select('#userLink'),
63207                   logoutLink = selection.select('#logoutLink');
63208
63209               userLink.html('');
63210               logoutLink.html('');
63211
63212               if (err) return;
63213
63214               selection.selectAll('#userLink, #logoutLink')
63215                   .classed('hide', false);
63216
63217               // Link
63218               userLink.append('a')
63219                   .attr('href', osm.userURL(details.display_name))
63220                   .attr('target', '_blank');
63221
63222               // Add thumbnail or dont
63223               if (details.image_url) {
63224                   userLink.append('img')
63225                       .attr('class', 'icon pre-text user-icon')
63226                       .attr('src', details.image_url);
63227               } else {
63228                   userLink
63229                       .call(svgIcon('#iD-icon-avatar', 'pre-text light'));
63230               }
63231
63232               // Add user name
63233               userLink.append('span')
63234                   .attr('class', 'label')
63235                   .text(details.display_name);
63236
63237               logoutLink.append('a')
63238                   .attr('class', 'logout')
63239                   .attr('href', '#')
63240                   .text(t('logout'))
63241                   .on('click.logout', function() {
63242                       event.preventDefault();
63243                       osm.logout();
63244                   });
63245           });
63246       }
63247
63248
63249       return function(selection) {
63250           selection.append('li')
63251               .attr('id', 'logoutLink')
63252               .classed('hide', true);
63253
63254           selection.append('li')
63255               .attr('id', 'userLink')
63256               .classed('hide', true);
63257
63258           if (osm) {
63259               osm.on('change.account', function() { update(selection); });
63260               update(selection);
63261           }
63262       };
63263   }
63264
63265   function uiAttribution(context) {
63266       var selection;
63267
63268
63269       function attribution(data, klass) {
63270           var div = selection.selectAll('.' + klass)
63271               .data([0]);
63272
63273           div = div.enter()
63274               .append('div')
63275               .attr('class', klass)
63276               .merge(div);
63277
63278
63279           var background = div.selectAll('.attribution')
63280               .data(data, function(d) { return d.name(); });
63281
63282           background.exit()
63283               .remove();
63284
63285           background = background.enter()
63286               .append('span')
63287               .attr('class', 'attribution')
63288               .each(function(d) {
63289                   if (d.terms_html) {
63290                       select(this)
63291                           .html(d.terms_html);
63292                       return;
63293                   }
63294
63295                   var selection;
63296                   if (d.terms_url) {
63297                       selection = select(this)
63298                           .append('a')
63299                           .attr('href', d.terms_url)
63300                           .attr('target', '_blank');
63301                   } else {
63302                       selection = select(this);
63303                   }
63304
63305
63306                   var id_safe = d.id.replace(/\./g, '<TX_DOT>');
63307                   var terms_text = t('imagery.' + id_safe + '.attribution.text',
63308                       { default: d.terms_text || d.id || d.name() }
63309                   );
63310
63311                   if (d.icon && !d.overlay) {
63312                       selection
63313                           .append('img')
63314                           .attr('class', 'source-image')
63315                           .attr('src', d.icon);
63316                   }
63317
63318                   selection
63319                       .append('span')
63320                       .attr('class', 'attribution-text')
63321                       .text(terms_text);
63322               })
63323               .merge(background);
63324
63325
63326           var copyright = background.selectAll('.copyright-notice')
63327               .data(function(d) {
63328                   var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
63329                   return notice ? [notice] : [];
63330               });
63331
63332           copyright.exit()
63333               .remove();
63334
63335           copyright = copyright.enter()
63336               .append('span')
63337               .attr('class', 'copyright-notice')
63338               .merge(copyright);
63339
63340           copyright
63341               .text(String);
63342       }
63343
63344
63345       function update() {
63346           attribution([context.background().baseLayerSource()], 'base-layer-attribution');
63347           attribution(context.background().overlayLayerSources().filter(function (s) {
63348               return s.validZoom(context.map().zoom());
63349           }), 'overlay-layer-attribution');
63350       }
63351
63352
63353       return function(select) {
63354           selection = select;
63355
63356           context.background()
63357               .on('change.attribution', update);
63358
63359           context.map()
63360               .on('move.attribution', throttle(update, 400, {leading: false}));
63361
63362           update();
63363       };
63364   }
63365
63366   // toggles the visibility of ui elements, using a combination of the
63367   // hide class, which sets display=none, and a d3 transition for opacity.
63368   // this will cause blinking when called repeatedly, so check that the
63369   // value actually changes between calls.
63370   function uiToggle(show, callback) {
63371       return function(selection) {
63372           selection
63373               .style('opacity', show ? 0 : 1)
63374               .classed('hide', false)
63375               .transition()
63376               .style('opacity', show ? 1 : 0)
63377               .on('end', function() {
63378                   select(this)
63379                       .classed('hide', !show)
63380                       .style('opacity', null);
63381                   if (callback) callback.apply(this);
63382               });
63383       };
63384   }
63385
63386   function uiDisclosure(context, key, expandedDefault) {
63387       var dispatch$1 = dispatch('toggled');
63388       var _preference = (context.storage('disclosure.' + key + '.expanded'));
63389       var _expanded = (_preference === null ? !!expandedDefault : (_preference === 'true'));
63390       var _title;
63391       var _updatePreference = true;
63392       var _content = function () {};
63393
63394
63395       var disclosure = function(selection) {
63396           var hideToggle = selection.selectAll('.hide-toggle-' + key)
63397               .data([0]);
63398
63399           // enter
63400           var hideToggleEnter = hideToggle.enter()
63401               .append('a')
63402               .attr('href', '#')
63403               .attr('class', 'hide-toggle hide-toggle-' + key)
63404               .call(svgIcon('', 'pre-text', 'hide-toggle-icon'));
63405
63406           hideToggleEnter
63407               .append('span')
63408               .attr('class', 'hide-toggle-text');
63409
63410           // update
63411           hideToggle = hideToggleEnter
63412               .merge(hideToggle);
63413
63414           hideToggle
63415               .on('click', toggle)
63416               .classed('expanded', _expanded);
63417
63418           hideToggle.selectAll('.hide-toggle-text')
63419               .text(_title);
63420
63421           hideToggle.selectAll('.hide-toggle-icon')
63422               .attr('xlink:href', _expanded ? '#iD-icon-down'
63423                   : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
63424               );
63425
63426
63427           var wrap = selection.selectAll('.disclosure-wrap')
63428               .data([0]);
63429
63430           // enter/update
63431           wrap = wrap.enter()
63432               .append('div')
63433               .attr('class', 'disclosure-wrap disclosure-wrap-' + key)
63434               .merge(wrap)
63435               .classed('hide', !_expanded);
63436
63437           if (_expanded) {
63438               wrap
63439                   .call(_content);
63440           }
63441
63442
63443           function toggle() {
63444               event.preventDefault();
63445
63446               _expanded = !_expanded;
63447
63448               if (_updatePreference) {
63449                   context.storage('disclosure.' + key + '.expanded', _expanded);
63450               }
63451
63452               hideToggle
63453                   .classed('expanded', _expanded);
63454
63455               hideToggle.selectAll('.hide-toggle-icon')
63456                   .attr('xlink:href', _expanded ? '#iD-icon-down'
63457                       : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
63458                   );
63459
63460               if (_expanded) {
63461                   wrap
63462                       .call(_content);
63463               }
63464
63465               wrap
63466                   .call(uiToggle(_expanded));
63467
63468               dispatch$1.call('toggled', this, _expanded);
63469           }
63470       };
63471
63472
63473       disclosure.title = function(val) {
63474           if (!arguments.length) return _title;
63475           _title = val;
63476           return disclosure;
63477       };
63478
63479
63480       disclosure.expanded = function(val) {
63481           if (!arguments.length) return _expanded;
63482           _expanded = val;
63483           return disclosure;
63484       };
63485
63486
63487       disclosure.updatePreference = function(val) {
63488           if (!arguments.length) return _updatePreference;
63489           _updatePreference = val;
63490           return disclosure;
63491       };
63492
63493
63494       disclosure.content = function(val) {
63495           if (!arguments.length) return _content;
63496           _content = val;
63497           return disclosure;
63498       };
63499
63500
63501       return utilRebind(disclosure, dispatch$1, 'on');
63502   }
63503
63504   function uiBackgroundDisplayOptions(context) {
63505       var detected = utilDetect();
63506       var storedOpacity = context.storage('background-opacity');
63507       var minVal = 0.25;
63508       var maxVal = detected.cssfilters ? 2 : 1;
63509
63510       var sliders = detected.cssfilters
63511           ? ['brightness', 'contrast', 'saturation', 'sharpness']
63512           : ['brightness'];
63513
63514       var _options = {
63515           brightness: (storedOpacity !== null ? (+storedOpacity) : 1),
63516           contrast: 1,
63517           saturation: 1,
63518           sharpness: 1
63519       };
63520
63521       var _selection = select(null);
63522
63523
63524       function clamp(x, min, max) {
63525           return Math.max(min, Math.min(x, max));
63526       }
63527
63528
63529       function updateValue(d, val) {
63530           if (!val && event && event.target) {
63531               val = event.target.value;
63532           }
63533
63534           val = clamp(val, minVal, maxVal);
63535
63536           _options[d] = val;
63537           context.background()[d](val);
63538
63539           if (d === 'brightness') {
63540               context.storage('background-opacity', val);
63541           }
63542
63543           _selection
63544               .call(render);
63545       }
63546
63547
63548       function render(selection) {
63549           var container = selection.selectAll('.display-options-container')
63550               .data([0]);
63551
63552           var containerEnter = container.enter()
63553               .append('div')
63554               .attr('class', 'display-options-container controls-list');
63555
63556           // add slider controls
63557           var slidersEnter = containerEnter.selectAll('.display-control')
63558               .data(sliders)
63559               .enter()
63560               .append('div')
63561               .attr('class', function(d) { return 'display-control display-control-' + d; });
63562
63563           slidersEnter
63564               .append('h5')
63565               .text(function(d) { return t('background.' + d); })
63566               .append('span')
63567               .attr('class', function(d) { return 'display-option-value display-option-value-' + d; });
63568
63569           slidersEnter
63570               .append('input')
63571               .attr('class', function(d) { return 'display-option-input display-option-input-' + d; })
63572               .attr('type', 'range')
63573               .attr('min', minVal)
63574               .attr('max', maxVal)
63575               .attr('step', '0.05')
63576               .on('input', function(d) {
63577                   var val = select(this).property('value');
63578                   updateValue(d, val);
63579               });
63580
63581           slidersEnter
63582               .append('button')
63583               .attr('title', t('background.reset'))
63584               .attr('class', function(d) { return 'display-option-reset display-option-reset-' + d; })
63585               .on('click', function(d) {
63586                   if (event.button !== 0) return;
63587                   updateValue(d, 1);
63588               })
63589               .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
63590
63591
63592           // update
63593           container = containerEnter
63594               .merge(container);
63595
63596           container.selectAll('.display-option-input')
63597               .property('value', function(d) { return _options[d]; });
63598
63599           container.selectAll('.display-option-value')
63600               .text(function(d) { return Math.floor(_options[d] * 100) + '%'; });
63601
63602           container.selectAll('.display-option-reset')
63603               .classed('disabled', function(d) { return _options[d] === 1; });
63604
63605           // first time only, set brightness if needed
63606           if (containerEnter.size() && _options.brightness !== 1) {
63607               context.background().brightness(_options.brightness);
63608           }
63609       }
63610
63611
63612       function backgroundDisplayOptions(selection) {
63613           _selection = selection;
63614
63615           selection
63616               .call(uiDisclosure(context, 'background_display_options', true)
63617                   .title(t('background.display_options'))
63618                   .content(render)
63619               );
63620       }
63621
63622
63623       return backgroundDisplayOptions;
63624   }
63625
63626   function uiBackgroundOffset(context) {
63627       var directions = [
63628           ['right', [0.5, 0]],
63629           ['top', [0, -0.5]],
63630           ['left', [-0.5, 0]],
63631           ['bottom', [0, 0.5]]
63632       ];
63633
63634
63635       function d3_eventCancel() {
63636           event.stopPropagation();
63637           event.preventDefault();
63638       }
63639
63640
63641       function updateValue() {
63642           var meters = geoOffsetToMeters(context.background().offset());
63643           var x = +meters[0].toFixed(2);
63644           var y = +meters[1].toFixed(2);
63645
63646           d3_selectAll('.nudge-inner-rect')
63647               .select('input')
63648               .classed('error', false)
63649               .property('value', x + ', ' + y);
63650
63651           d3_selectAll('.nudge-reset')
63652               .classed('disabled', function() {
63653                   return (x === 0 && y === 0);
63654               });
63655       }
63656
63657
63658       function resetOffset() {
63659           context.background().offset([0, 0]);
63660           updateValue();
63661       }
63662
63663
63664       function nudge(d) {
63665           context.background().nudge(d, context.map().zoom());
63666           updateValue();
63667       }
63668
63669
63670       function clickNudgeButton(d) {
63671           var interval;
63672           var timeout = window.setTimeout(function() {
63673                   interval = window.setInterval(nudge.bind(null, d), 100);
63674               }, 500);
63675
63676           function doneNudge() {
63677               window.clearTimeout(timeout);
63678               window.clearInterval(interval);
63679               select(window)
63680                   .on('mouseup.buttonoffset', null, true)
63681                   .on('mousedown.buttonoffset', null, true);
63682           }
63683
63684           select(window)
63685               .on('mouseup.buttonoffset', doneNudge, true)
63686               .on('mousedown.buttonoffset', doneNudge, true);
63687
63688           nudge(d);
63689       }
63690
63691
63692       function inputOffset() {
63693           var input = select(this);
63694           var d = input.node().value;
63695
63696           if (d === '') return resetOffset();
63697
63698           d = d.replace(/;/g, ',').split(',').map(function(n) {
63699               // if n is NaN, it will always get mapped to false.
63700               return !isNaN(n) && n;
63701           });
63702
63703           if (d.length !== 2 || !d[0] || !d[1]) {
63704               input.classed('error', true);
63705               return;
63706           }
63707
63708           context.background().offset(geoMetersToOffset(d));
63709           updateValue();
63710       }
63711
63712
63713       function dragOffset() {
63714           event.preventDefault();
63715           if (event.button !== 0) return;
63716
63717           var origin = [event.clientX, event.clientY];
63718
63719           context.container()
63720               .append('div')
63721               .attr('class', 'nudge-surface');
63722
63723           select(window)
63724               .on('mousemove.offset', function() {
63725                   var latest = [event.clientX, event.clientY];
63726                   var d = [
63727                       -(origin[0] - latest[0]) / 4,
63728                       -(origin[1] - latest[1]) / 4
63729                   ];
63730
63731                   origin = latest;
63732                   nudge(d);
63733               })
63734               .on('mouseup.offset', function() {
63735                   if (event.button !== 0) return;
63736                   d3_selectAll('.nudge-surface')
63737                       .remove();
63738
63739                   select(window)
63740                       .on('mousemove.offset', null)
63741                       .on('mouseup.offset', null);
63742               });
63743       }
63744
63745
63746       function render(selection) {
63747           var container = selection.selectAll('.nudge-container')
63748               .data([0]);
63749
63750           var containerEnter = container.enter()
63751               .append('div')
63752               .attr('class', 'nudge-container cf');
63753
63754           containerEnter
63755               .append('div')
63756               .attr('class', 'nudge-instructions')
63757               .text(t('background.offset'));
63758
63759           var nudgeEnter = containerEnter
63760               .append('div')
63761               .attr('class', 'nudge-outer-rect')
63762               .on('mousedown', dragOffset);
63763
63764           nudgeEnter
63765               .append('div')
63766               .attr('class', 'nudge-inner-rect')
63767               .append('input')
63768               .on('change', inputOffset);
63769
63770           containerEnter
63771               .append('div')
63772               .selectAll('button')
63773               .data(directions).enter()
63774               .append('button')
63775               .attr('class', function(d) { return d[0] + ' nudge'; })
63776               .on('contextmenu', d3_eventCancel)
63777               .on('mousedown', function(d) {
63778                   if (event.button !== 0) return;
63779                   clickNudgeButton(d[1]);
63780               });
63781
63782           containerEnter
63783               .append('button')
63784               .attr('title', t('background.reset'))
63785               .attr('class', 'nudge-reset disabled')
63786               .on('contextmenu', d3_eventCancel)
63787               .on('click', function() {
63788                   if (event.button !== 0) return;
63789                   resetOffset();
63790               })
63791               .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
63792
63793           updateValue();
63794       }
63795
63796
63797       function backgroundOffset(selection) {
63798           selection
63799               .call(uiDisclosure(context, 'background_offset', false)
63800                   .title(t('background.fix_misalignment'))
63801                   .content(render)
63802               );
63803       }
63804
63805
63806       context.background()
63807           .on('change.backgroundOffset-update', updateValue);
63808
63809       return backgroundOffset;
63810   }
63811
63812   var marked = createCommonjsModule(function (module, exports) {
63813   (function(root) {
63814
63815   /**
63816    * Block-Level Grammar
63817    */
63818
63819   var block = {
63820     newline: /^\n+/,
63821     code: /^( {4}[^\n]+\n*)+/,
63822     fences: noop,
63823     hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
63824     heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
63825     nptable: noop,
63826     blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
63827     list: /^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
63828     html: '^ {0,3}(?:' // optional indentation
63829       + '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
63830       + '|comment[^\\n]*(\\n+|$)' // (2)
63831       + '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
63832       + '|<![A-Z][\\s\\S]*?>\\n*' // (4)
63833       + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*' // (5)
63834       + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
63835       + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
63836       + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
63837       + ')',
63838     def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
63839     table: noop,
63840     lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
63841     paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,
63842     text: /^[^\n]+/
63843   };
63844
63845   block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
63846   block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
63847   block.def = edit(block.def)
63848     .replace('label', block._label)
63849     .replace('title', block._title)
63850     .getRegex();
63851
63852   block.bullet = /(?:[*+-]|\d{1,9}\.)/;
63853   block.item = /^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/;
63854   block.item = edit(block.item, 'gm')
63855     .replace(/bull/g, block.bullet)
63856     .getRegex();
63857
63858   block.list = edit(block.list)
63859     .replace(/bull/g, block.bullet)
63860     .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
63861     .replace('def', '\\n+(?=' + block.def.source + ')')
63862     .getRegex();
63863
63864   block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
63865     + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
63866     + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
63867     + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
63868     + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
63869     + '|track|ul';
63870   block._comment = /<!--(?!-?>)[\s\S]*?-->/;
63871   block.html = edit(block.html, 'i')
63872     .replace('comment', block._comment)
63873     .replace('tag', block._tag)
63874     .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
63875     .getRegex();
63876
63877   block.paragraph = edit(block.paragraph)
63878     .replace('hr', block.hr)
63879     .replace('heading', block.heading)
63880     .replace('lheading', block.lheading)
63881     .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
63882     .getRegex();
63883
63884   block.blockquote = edit(block.blockquote)
63885     .replace('paragraph', block.paragraph)
63886     .getRegex();
63887
63888   /**
63889    * Normal Block Grammar
63890    */
63891
63892   block.normal = merge({}, block);
63893
63894   /**
63895    * GFM Block Grammar
63896    */
63897
63898   block.gfm = merge({}, block.normal, {
63899     fences: /^ {0,3}(`{3,}|~{3,})([^`\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,
63900     paragraph: /^/,
63901     heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
63902   });
63903
63904   block.gfm.paragraph = edit(block.paragraph)
63905     .replace('(?!', '(?!'
63906       + block.gfm.fences.source.replace('\\1', '\\2') + '|'
63907       + block.list.source.replace('\\1', '\\3') + '|')
63908     .getRegex();
63909
63910   /**
63911    * GFM + Tables Block Grammar
63912    */
63913
63914   block.tables = merge({}, block.gfm, {
63915     nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
63916     table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/
63917   });
63918
63919   /**
63920    * Pedantic grammar
63921    */
63922
63923   block.pedantic = merge({}, block.normal, {
63924     html: edit(
63925       '^ *(?:comment *(?:\\n|\\s*$)'
63926       + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
63927       + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
63928       .replace('comment', block._comment)
63929       .replace(/tag/g, '(?!(?:'
63930         + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
63931         + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
63932         + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
63933       .getRegex(),
63934     def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/
63935   });
63936
63937   /**
63938    * Block Lexer
63939    */
63940
63941   function Lexer(options) {
63942     this.tokens = [];
63943     this.tokens.links = Object.create(null);
63944     this.options = options || marked.defaults;
63945     this.rules = block.normal;
63946
63947     if (this.options.pedantic) {
63948       this.rules = block.pedantic;
63949     } else if (this.options.gfm) {
63950       if (this.options.tables) {
63951         this.rules = block.tables;
63952       } else {
63953         this.rules = block.gfm;
63954       }
63955     }
63956   }
63957
63958   /**
63959    * Expose Block Rules
63960    */
63961
63962   Lexer.rules = block;
63963
63964   /**
63965    * Static Lex Method
63966    */
63967
63968   Lexer.lex = function(src, options) {
63969     var lexer = new Lexer(options);
63970     return lexer.lex(src);
63971   };
63972
63973   /**
63974    * Preprocessing
63975    */
63976
63977   Lexer.prototype.lex = function(src) {
63978     src = src
63979       .replace(/\r\n|\r/g, '\n')
63980       .replace(/\t/g, '    ')
63981       .replace(/\u00a0/g, ' ')
63982       .replace(/\u2424/g, '\n');
63983
63984     return this.token(src, true);
63985   };
63986
63987   /**
63988    * Lexing
63989    */
63990
63991   Lexer.prototype.token = function(src, top) {
63992     src = src.replace(/^ +$/gm, '');
63993     var next,
63994         loose,
63995         cap,
63996         bull,
63997         b,
63998         item,
63999         listStart,
64000         listItems,
64001         t,
64002         space,
64003         i,
64004         tag,
64005         l,
64006         isordered,
64007         istask,
64008         ischecked;
64009
64010     while (src) {
64011       // newline
64012       if (cap = this.rules.newline.exec(src)) {
64013         src = src.substring(cap[0].length);
64014         if (cap[0].length > 1) {
64015           this.tokens.push({
64016             type: 'space'
64017           });
64018         }
64019       }
64020
64021       // code
64022       if (cap = this.rules.code.exec(src)) {
64023         src = src.substring(cap[0].length);
64024         cap = cap[0].replace(/^ {4}/gm, '');
64025         this.tokens.push({
64026           type: 'code',
64027           text: !this.options.pedantic
64028             ? rtrim(cap, '\n')
64029             : cap
64030         });
64031         continue;
64032       }
64033
64034       // fences (gfm)
64035       if (cap = this.rules.fences.exec(src)) {
64036         src = src.substring(cap[0].length);
64037         this.tokens.push({
64038           type: 'code',
64039           lang: cap[2] ? cap[2].trim() : cap[2],
64040           text: cap[3] || ''
64041         });
64042         continue;
64043       }
64044
64045       // heading
64046       if (cap = this.rules.heading.exec(src)) {
64047         src = src.substring(cap[0].length);
64048         this.tokens.push({
64049           type: 'heading',
64050           depth: cap[1].length,
64051           text: cap[2]
64052         });
64053         continue;
64054       }
64055
64056       // table no leading pipe (gfm)
64057       if (top && (cap = this.rules.nptable.exec(src))) {
64058         item = {
64059           type: 'table',
64060           header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
64061           align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
64062           cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
64063         };
64064
64065         if (item.header.length === item.align.length) {
64066           src = src.substring(cap[0].length);
64067
64068           for (i = 0; i < item.align.length; i++) {
64069             if (/^ *-+: *$/.test(item.align[i])) {
64070               item.align[i] = 'right';
64071             } else if (/^ *:-+: *$/.test(item.align[i])) {
64072               item.align[i] = 'center';
64073             } else if (/^ *:-+ *$/.test(item.align[i])) {
64074               item.align[i] = 'left';
64075             } else {
64076               item.align[i] = null;
64077             }
64078           }
64079
64080           for (i = 0; i < item.cells.length; i++) {
64081             item.cells[i] = splitCells(item.cells[i], item.header.length);
64082           }
64083
64084           this.tokens.push(item);
64085
64086           continue;
64087         }
64088       }
64089
64090       // hr
64091       if (cap = this.rules.hr.exec(src)) {
64092         src = src.substring(cap[0].length);
64093         this.tokens.push({
64094           type: 'hr'
64095         });
64096         continue;
64097       }
64098
64099       // blockquote
64100       if (cap = this.rules.blockquote.exec(src)) {
64101         src = src.substring(cap[0].length);
64102
64103         this.tokens.push({
64104           type: 'blockquote_start'
64105         });
64106
64107         cap = cap[0].replace(/^ *> ?/gm, '');
64108
64109         // Pass `top` to keep the current
64110         // "toplevel" state. This is exactly
64111         // how markdown.pl works.
64112         this.token(cap, top);
64113
64114         this.tokens.push({
64115           type: 'blockquote_end'
64116         });
64117
64118         continue;
64119       }
64120
64121       // list
64122       if (cap = this.rules.list.exec(src)) {
64123         src = src.substring(cap[0].length);
64124         bull = cap[2];
64125         isordered = bull.length > 1;
64126
64127         listStart = {
64128           type: 'list_start',
64129           ordered: isordered,
64130           start: isordered ? +bull : '',
64131           loose: false
64132         };
64133
64134         this.tokens.push(listStart);
64135
64136         // Get each top-level item.
64137         cap = cap[0].match(this.rules.item);
64138
64139         listItems = [];
64140         next = false;
64141         l = cap.length;
64142         i = 0;
64143
64144         for (; i < l; i++) {
64145           item = cap[i];
64146
64147           // Remove the list item's bullet
64148           // so it is seen as the next token.
64149           space = item.length;
64150           item = item.replace(/^ *([*+-]|\d+\.) */, '');
64151
64152           // Outdent whatever the
64153           // list item contains. Hacky.
64154           if (~item.indexOf('\n ')) {
64155             space -= item.length;
64156             item = !this.options.pedantic
64157               ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
64158               : item.replace(/^ {1,4}/gm, '');
64159           }
64160
64161           // Determine whether the next list item belongs here.
64162           // Backpedal if it does not belong in this list.
64163           if (i !== l - 1) {
64164             b = block.bullet.exec(cap[i + 1])[0];
64165             if (bull.length > 1 ? b.length === 1
64166               : (b.length > 1 || (this.options.smartLists && b !== bull))) {
64167               src = cap.slice(i + 1).join('\n') + src;
64168               i = l - 1;
64169             }
64170           }
64171
64172           // Determine whether item is loose or not.
64173           // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
64174           // for discount behavior.
64175           loose = next || /\n\n(?!\s*$)/.test(item);
64176           if (i !== l - 1) {
64177             next = item.charAt(item.length - 1) === '\n';
64178             if (!loose) loose = next;
64179           }
64180
64181           if (loose) {
64182             listStart.loose = true;
64183           }
64184
64185           // Check for task list items
64186           istask = /^\[[ xX]\] /.test(item);
64187           ischecked = undefined;
64188           if (istask) {
64189             ischecked = item[1] !== ' ';
64190             item = item.replace(/^\[[ xX]\] +/, '');
64191           }
64192
64193           t = {
64194             type: 'list_item_start',
64195             task: istask,
64196             checked: ischecked,
64197             loose: loose
64198           };
64199
64200           listItems.push(t);
64201           this.tokens.push(t);
64202
64203           // Recurse.
64204           this.token(item, false);
64205
64206           this.tokens.push({
64207             type: 'list_item_end'
64208           });
64209         }
64210
64211         if (listStart.loose) {
64212           l = listItems.length;
64213           i = 0;
64214           for (; i < l; i++) {
64215             listItems[i].loose = true;
64216           }
64217         }
64218
64219         this.tokens.push({
64220           type: 'list_end'
64221         });
64222
64223         continue;
64224       }
64225
64226       // html
64227       if (cap = this.rules.html.exec(src)) {
64228         src = src.substring(cap[0].length);
64229         this.tokens.push({
64230           type: this.options.sanitize
64231             ? 'paragraph'
64232             : 'html',
64233           pre: !this.options.sanitizer
64234             && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
64235           text: cap[0]
64236         });
64237         continue;
64238       }
64239
64240       // def
64241       if (top && (cap = this.rules.def.exec(src))) {
64242         src = src.substring(cap[0].length);
64243         if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
64244         tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
64245         if (!this.tokens.links[tag]) {
64246           this.tokens.links[tag] = {
64247             href: cap[2],
64248             title: cap[3]
64249           };
64250         }
64251         continue;
64252       }
64253
64254       // table (gfm)
64255       if (top && (cap = this.rules.table.exec(src))) {
64256         item = {
64257           type: 'table',
64258           header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
64259           align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
64260           cells: cap[3] ? cap[3].replace(/(?: *\| *)?\n$/, '').split('\n') : []
64261         };
64262
64263         if (item.header.length === item.align.length) {
64264           src = src.substring(cap[0].length);
64265
64266           for (i = 0; i < item.align.length; i++) {
64267             if (/^ *-+: *$/.test(item.align[i])) {
64268               item.align[i] = 'right';
64269             } else if (/^ *:-+: *$/.test(item.align[i])) {
64270               item.align[i] = 'center';
64271             } else if (/^ *:-+ *$/.test(item.align[i])) {
64272               item.align[i] = 'left';
64273             } else {
64274               item.align[i] = null;
64275             }
64276           }
64277
64278           for (i = 0; i < item.cells.length; i++) {
64279             item.cells[i] = splitCells(
64280               item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
64281               item.header.length);
64282           }
64283
64284           this.tokens.push(item);
64285
64286           continue;
64287         }
64288       }
64289
64290       // lheading
64291       if (cap = this.rules.lheading.exec(src)) {
64292         src = src.substring(cap[0].length);
64293         this.tokens.push({
64294           type: 'heading',
64295           depth: cap[2] === '=' ? 1 : 2,
64296           text: cap[1]
64297         });
64298         continue;
64299       }
64300
64301       // top-level paragraph
64302       if (top && (cap = this.rules.paragraph.exec(src))) {
64303         src = src.substring(cap[0].length);
64304         this.tokens.push({
64305           type: 'paragraph',
64306           text: cap[1].charAt(cap[1].length - 1) === '\n'
64307             ? cap[1].slice(0, -1)
64308             : cap[1]
64309         });
64310         continue;
64311       }
64312
64313       // text
64314       if (cap = this.rules.text.exec(src)) {
64315         // Top-level should never reach here.
64316         src = src.substring(cap[0].length);
64317         this.tokens.push({
64318           type: 'text',
64319           text: cap[0]
64320         });
64321         continue;
64322       }
64323
64324       if (src) {
64325         throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
64326       }
64327     }
64328
64329     return this.tokens;
64330   };
64331
64332   /**
64333    * Inline-Level Grammar
64334    */
64335
64336   var inline = {
64337     escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
64338     autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
64339     url: noop,
64340     tag: '^comment'
64341       + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
64342       + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
64343       + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
64344       + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
64345       + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', // CDATA section
64346     link: /^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,
64347     reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
64348     nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
64349     strong: /^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,
64350     em: /^_([^\s_])_(?!_)|^\*([^\s*"<\[])\*(?!\*)|^_([^\s][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s"<\[][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,
64351     code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
64352     br: /^( {2,}|\\)\n(?!\s*$)/,
64353     del: noop,
64354     text: /^(`+|[^`])[\s\S]*?(?=[\\<!\[`*]|\b_| {2,}\n|$)/
64355   };
64356
64357   // list of punctuation marks from common mark spec
64358   // without ` and ] to workaround Rule 17 (inline code blocks/links)
64359   inline._punctuation = '!"#$%&\'()*+,\\-./:;<=>?@\\[^_{|}~';
64360   inline.em = edit(inline.em).replace(/punctuation/g, inline._punctuation).getRegex();
64361
64362   inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
64363
64364   inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
64365   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])?)+(?![-_])/;
64366   inline.autolink = edit(inline.autolink)
64367     .replace('scheme', inline._scheme)
64368     .replace('email', inline._email)
64369     .getRegex();
64370
64371   inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
64372
64373   inline.tag = edit(inline.tag)
64374     .replace('comment', block._comment)
64375     .replace('attribute', inline._attribute)
64376     .getRegex();
64377
64378   inline._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/;
64379   inline._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|(?:\\[()]?|\([^\s\x00-\x1f\\]*\)|[^\s\x00-\x1f()\\])*?)/;
64380   inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
64381
64382   inline.link = edit(inline.link)
64383     .replace('label', inline._label)
64384     .replace('href', inline._href)
64385     .replace('title', inline._title)
64386     .getRegex();
64387
64388   inline.reflink = edit(inline.reflink)
64389     .replace('label', inline._label)
64390     .getRegex();
64391
64392   /**
64393    * Normal Inline Grammar
64394    */
64395
64396   inline.normal = merge({}, inline);
64397
64398   /**
64399    * Pedantic Inline Grammar
64400    */
64401
64402   inline.pedantic = merge({}, inline.normal, {
64403     strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
64404     em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
64405     link: edit(/^!?\[(label)\]\((.*?)\)/)
64406       .replace('label', inline._label)
64407       .getRegex(),
64408     reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
64409       .replace('label', inline._label)
64410       .getRegex()
64411   });
64412
64413   /**
64414    * GFM Inline Grammar
64415    */
64416
64417   inline.gfm = merge({}, inline.normal, {
64418     escape: edit(inline.escape).replace('])', '~|])').getRegex(),
64419     _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
64420     url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
64421     _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
64422     del: /^~+(?=\S)([\s\S]*?\S)~+/,
64423     text: edit(inline.text)
64424       .replace(']|', '~]|')
64425       .replace('|$', '|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&\'*+/=?^_`{\\|}~-]+@|$')
64426       .getRegex()
64427   });
64428
64429   inline.gfm.url = edit(inline.gfm.url, 'i')
64430     .replace('email', inline.gfm._extended_email)
64431     .getRegex();
64432   /**
64433    * GFM + Line Breaks Inline Grammar
64434    */
64435
64436   inline.breaks = merge({}, inline.gfm, {
64437     br: edit(inline.br).replace('{2,}', '*').getRegex(),
64438     text: edit(inline.gfm.text).replace('{2,}', '*').getRegex()
64439   });
64440
64441   /**
64442    * Inline Lexer & Compiler
64443    */
64444
64445   function InlineLexer(links, options) {
64446     this.options = options || marked.defaults;
64447     this.links = links;
64448     this.rules = inline.normal;
64449     this.renderer = this.options.renderer || new Renderer();
64450     this.renderer.options = this.options;
64451
64452     if (!this.links) {
64453       throw new Error('Tokens array requires a `links` property.');
64454     }
64455
64456     if (this.options.pedantic) {
64457       this.rules = inline.pedantic;
64458     } else if (this.options.gfm) {
64459       if (this.options.breaks) {
64460         this.rules = inline.breaks;
64461       } else {
64462         this.rules = inline.gfm;
64463       }
64464     }
64465   }
64466
64467   /**
64468    * Expose Inline Rules
64469    */
64470
64471   InlineLexer.rules = inline;
64472
64473   /**
64474    * Static Lexing/Compiling Method
64475    */
64476
64477   InlineLexer.output = function(src, links, options) {
64478     var inline = new InlineLexer(links, options);
64479     return inline.output(src);
64480   };
64481
64482   /**
64483    * Lexing/Compiling
64484    */
64485
64486   InlineLexer.prototype.output = function(src) {
64487     var out = '',
64488         link,
64489         text,
64490         href,
64491         title,
64492         cap,
64493         prevCapZero;
64494
64495     while (src) {
64496       // escape
64497       if (cap = this.rules.escape.exec(src)) {
64498         src = src.substring(cap[0].length);
64499         out += escape(cap[1]);
64500         continue;
64501       }
64502
64503       // tag
64504       if (cap = this.rules.tag.exec(src)) {
64505         if (!this.inLink && /^<a /i.test(cap[0])) {
64506           this.inLink = true;
64507         } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
64508           this.inLink = false;
64509         }
64510         if (!this.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
64511           this.inRawBlock = true;
64512         } else if (this.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
64513           this.inRawBlock = false;
64514         }
64515
64516         src = src.substring(cap[0].length);
64517         out += this.options.sanitize
64518           ? this.options.sanitizer
64519             ? this.options.sanitizer(cap[0])
64520             : escape(cap[0])
64521           : cap[0];
64522         continue;
64523       }
64524
64525       // link
64526       if (cap = this.rules.link.exec(src)) {
64527         src = src.substring(cap[0].length);
64528         this.inLink = true;
64529         href = cap[2];
64530         if (this.options.pedantic) {
64531           link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
64532
64533           if (link) {
64534             href = link[1];
64535             title = link[3];
64536           } else {
64537             title = '';
64538           }
64539         } else {
64540           title = cap[3] ? cap[3].slice(1, -1) : '';
64541         }
64542         href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
64543         out += this.outputLink(cap, {
64544           href: InlineLexer.escapes(href),
64545           title: InlineLexer.escapes(title)
64546         });
64547         this.inLink = false;
64548         continue;
64549       }
64550
64551       // reflink, nolink
64552       if ((cap = this.rules.reflink.exec(src))
64553           || (cap = this.rules.nolink.exec(src))) {
64554         src = src.substring(cap[0].length);
64555         link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
64556         link = this.links[link.toLowerCase()];
64557         if (!link || !link.href) {
64558           out += cap[0].charAt(0);
64559           src = cap[0].substring(1) + src;
64560           continue;
64561         }
64562         this.inLink = true;
64563         out += this.outputLink(cap, link);
64564         this.inLink = false;
64565         continue;
64566       }
64567
64568       // strong
64569       if (cap = this.rules.strong.exec(src)) {
64570         src = src.substring(cap[0].length);
64571         out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));
64572         continue;
64573       }
64574
64575       // em
64576       if (cap = this.rules.em.exec(src)) {
64577         src = src.substring(cap[0].length);
64578         out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));
64579         continue;
64580       }
64581
64582       // code
64583       if (cap = this.rules.code.exec(src)) {
64584         src = src.substring(cap[0].length);
64585         out += this.renderer.codespan(escape(cap[2].trim(), true));
64586         continue;
64587       }
64588
64589       // br
64590       if (cap = this.rules.br.exec(src)) {
64591         src = src.substring(cap[0].length);
64592         out += this.renderer.br();
64593         continue;
64594       }
64595
64596       // del (gfm)
64597       if (cap = this.rules.del.exec(src)) {
64598         src = src.substring(cap[0].length);
64599         out += this.renderer.del(this.output(cap[1]));
64600         continue;
64601       }
64602
64603       // autolink
64604       if (cap = this.rules.autolink.exec(src)) {
64605         src = src.substring(cap[0].length);
64606         if (cap[2] === '@') {
64607           text = escape(this.mangle(cap[1]));
64608           href = 'mailto:' + text;
64609         } else {
64610           text = escape(cap[1]);
64611           href = text;
64612         }
64613         out += this.renderer.link(href, null, text);
64614         continue;
64615       }
64616
64617       // url (gfm)
64618       if (!this.inLink && (cap = this.rules.url.exec(src))) {
64619         if (cap[2] === '@') {
64620           text = escape(cap[0]);
64621           href = 'mailto:' + text;
64622         } else {
64623           // do extended autolink path validation
64624           do {
64625             prevCapZero = cap[0];
64626             cap[0] = this.rules._backpedal.exec(cap[0])[0];
64627           } while (prevCapZero !== cap[0]);
64628           text = escape(cap[0]);
64629           if (cap[1] === 'www.') {
64630             href = 'http://' + text;
64631           } else {
64632             href = text;
64633           }
64634         }
64635         src = src.substring(cap[0].length);
64636         out += this.renderer.link(href, null, text);
64637         continue;
64638       }
64639
64640       // text
64641       if (cap = this.rules.text.exec(src)) {
64642         src = src.substring(cap[0].length);
64643         if (this.inRawBlock) {
64644           out += this.renderer.text(cap[0]);
64645         } else {
64646           out += this.renderer.text(escape(this.smartypants(cap[0])));
64647         }
64648         continue;
64649       }
64650
64651       if (src) {
64652         throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
64653       }
64654     }
64655
64656     return out;
64657   };
64658
64659   InlineLexer.escapes = function(text) {
64660     return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
64661   };
64662
64663   /**
64664    * Compile Link
64665    */
64666
64667   InlineLexer.prototype.outputLink = function(cap, link) {
64668     var href = link.href,
64669         title = link.title ? escape(link.title) : null;
64670
64671     return cap[0].charAt(0) !== '!'
64672       ? this.renderer.link(href, title, this.output(cap[1]))
64673       : this.renderer.image(href, title, escape(cap[1]));
64674   };
64675
64676   /**
64677    * Smartypants Transformations
64678    */
64679
64680   InlineLexer.prototype.smartypants = function(text) {
64681     if (!this.options.smartypants) return text;
64682     return text
64683       // em-dashes
64684       .replace(/---/g, '\u2014')
64685       // en-dashes
64686       .replace(/--/g, '\u2013')
64687       // opening singles
64688       .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
64689       // closing singles & apostrophes
64690       .replace(/'/g, '\u2019')
64691       // opening doubles
64692       .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
64693       // closing doubles
64694       .replace(/"/g, '\u201d')
64695       // ellipses
64696       .replace(/\.{3}/g, '\u2026');
64697   };
64698
64699   /**
64700    * Mangle Links
64701    */
64702
64703   InlineLexer.prototype.mangle = function(text) {
64704     if (!this.options.mangle) return text;
64705     var out = '',
64706         l = text.length,
64707         i = 0,
64708         ch;
64709
64710     for (; i < l; i++) {
64711       ch = text.charCodeAt(i);
64712       if (Math.random() > 0.5) {
64713         ch = 'x' + ch.toString(16);
64714       }
64715       out += '&#' + ch + ';';
64716     }
64717
64718     return out;
64719   };
64720
64721   /**
64722    * Renderer
64723    */
64724
64725   function Renderer(options) {
64726     this.options = options || marked.defaults;
64727   }
64728
64729   Renderer.prototype.code = function(code, infostring, escaped) {
64730     var lang = (infostring || '').match(/\S*/)[0];
64731     if (this.options.highlight) {
64732       var out = this.options.highlight(code, lang);
64733       if (out != null && out !== code) {
64734         escaped = true;
64735         code = out;
64736       }
64737     }
64738
64739     if (!lang) {
64740       return '<pre><code>'
64741         + (escaped ? code : escape(code, true))
64742         + '</code></pre>';
64743     }
64744
64745     return '<pre><code class="'
64746       + this.options.langPrefix
64747       + escape(lang, true)
64748       + '">'
64749       + (escaped ? code : escape(code, true))
64750       + '</code></pre>\n';
64751   };
64752
64753   Renderer.prototype.blockquote = function(quote) {
64754     return '<blockquote>\n' + quote + '</blockquote>\n';
64755   };
64756
64757   Renderer.prototype.html = function(html) {
64758     return html;
64759   };
64760
64761   Renderer.prototype.heading = function(text, level, raw, slugger) {
64762     if (this.options.headerIds) {
64763       return '<h'
64764         + level
64765         + ' id="'
64766         + this.options.headerPrefix
64767         + slugger.slug(raw)
64768         + '">'
64769         + text
64770         + '</h'
64771         + level
64772         + '>\n';
64773     }
64774     // ignore IDs
64775     return '<h' + level + '>' + text + '</h' + level + '>\n';
64776   };
64777
64778   Renderer.prototype.hr = function() {
64779     return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
64780   };
64781
64782   Renderer.prototype.list = function(body, ordered, start) {
64783     var type = ordered ? 'ol' : 'ul',
64784         startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
64785     return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
64786   };
64787
64788   Renderer.prototype.listitem = function(text) {
64789     return '<li>' + text + '</li>\n';
64790   };
64791
64792   Renderer.prototype.checkbox = function(checked) {
64793     return '<input '
64794       + (checked ? 'checked="" ' : '')
64795       + 'disabled="" type="checkbox"'
64796       + (this.options.xhtml ? ' /' : '')
64797       + '> ';
64798   };
64799
64800   Renderer.prototype.paragraph = function(text) {
64801     return '<p>' + text + '</p>\n';
64802   };
64803
64804   Renderer.prototype.table = function(header, body) {
64805     if (body) body = '<tbody>' + body + '</tbody>';
64806
64807     return '<table>\n'
64808       + '<thead>\n'
64809       + header
64810       + '</thead>\n'
64811       + body
64812       + '</table>\n';
64813   };
64814
64815   Renderer.prototype.tablerow = function(content) {
64816     return '<tr>\n' + content + '</tr>\n';
64817   };
64818
64819   Renderer.prototype.tablecell = function(content, flags) {
64820     var type = flags.header ? 'th' : 'td';
64821     var tag = flags.align
64822       ? '<' + type + ' align="' + flags.align + '">'
64823       : '<' + type + '>';
64824     return tag + content + '</' + type + '>\n';
64825   };
64826
64827   // span level renderer
64828   Renderer.prototype.strong = function(text) {
64829     return '<strong>' + text + '</strong>';
64830   };
64831
64832   Renderer.prototype.em = function(text) {
64833     return '<em>' + text + '</em>';
64834   };
64835
64836   Renderer.prototype.codespan = function(text) {
64837     return '<code>' + text + '</code>';
64838   };
64839
64840   Renderer.prototype.br = function() {
64841     return this.options.xhtml ? '<br/>' : '<br>';
64842   };
64843
64844   Renderer.prototype.del = function(text) {
64845     return '<del>' + text + '</del>';
64846   };
64847
64848   Renderer.prototype.link = function(href, title, text) {
64849     href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
64850     if (href === null) {
64851       return text;
64852     }
64853     var out = '<a href="' + escape(href) + '"';
64854     if (title) {
64855       out += ' title="' + title + '"';
64856     }
64857     out += '>' + text + '</a>';
64858     return out;
64859   };
64860
64861   Renderer.prototype.image = function(href, title, text) {
64862     href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
64863     if (href === null) {
64864       return text;
64865     }
64866
64867     var out = '<img src="' + href + '" alt="' + text + '"';
64868     if (title) {
64869       out += ' title="' + title + '"';
64870     }
64871     out += this.options.xhtml ? '/>' : '>';
64872     return out;
64873   };
64874
64875   Renderer.prototype.text = function(text) {
64876     return text;
64877   };
64878
64879   /**
64880    * TextRenderer
64881    * returns only the textual part of the token
64882    */
64883
64884   function TextRenderer() {}
64885
64886   // no need for block level renderers
64887
64888   TextRenderer.prototype.strong =
64889   TextRenderer.prototype.em =
64890   TextRenderer.prototype.codespan =
64891   TextRenderer.prototype.del =
64892   TextRenderer.prototype.text = function (text) {
64893     return text;
64894   };
64895
64896   TextRenderer.prototype.link =
64897   TextRenderer.prototype.image = function(href, title, text) {
64898     return '' + text;
64899   };
64900
64901   TextRenderer.prototype.br = function() {
64902     return '';
64903   };
64904
64905   /**
64906    * Parsing & Compiling
64907    */
64908
64909   function Parser(options) {
64910     this.tokens = [];
64911     this.token = null;
64912     this.options = options || marked.defaults;
64913     this.options.renderer = this.options.renderer || new Renderer();
64914     this.renderer = this.options.renderer;
64915     this.renderer.options = this.options;
64916     this.slugger = new Slugger();
64917   }
64918
64919   /**
64920    * Static Parse Method
64921    */
64922
64923   Parser.parse = function(src, options) {
64924     var parser = new Parser(options);
64925     return parser.parse(src);
64926   };
64927
64928   /**
64929    * Parse Loop
64930    */
64931
64932   Parser.prototype.parse = function(src) {
64933     this.inline = new InlineLexer(src.links, this.options);
64934     // use an InlineLexer with a TextRenderer to extract pure text
64935     this.inlineText = new InlineLexer(
64936       src.links,
64937       merge({}, this.options, {renderer: new TextRenderer()})
64938     );
64939     this.tokens = src.reverse();
64940
64941     var out = '';
64942     while (this.next()) {
64943       out += this.tok();
64944     }
64945
64946     return out;
64947   };
64948
64949   /**
64950    * Next Token
64951    */
64952
64953   Parser.prototype.next = function() {
64954     return this.token = this.tokens.pop();
64955   };
64956
64957   /**
64958    * Preview Next Token
64959    */
64960
64961   Parser.prototype.peek = function() {
64962     return this.tokens[this.tokens.length - 1] || 0;
64963   };
64964
64965   /**
64966    * Parse Text Tokens
64967    */
64968
64969   Parser.prototype.parseText = function() {
64970     var body = this.token.text;
64971
64972     while (this.peek().type === 'text') {
64973       body += '\n' + this.next().text;
64974     }
64975
64976     return this.inline.output(body);
64977   };
64978
64979   /**
64980    * Parse Current Token
64981    */
64982
64983   Parser.prototype.tok = function() {
64984     switch (this.token.type) {
64985       case 'space': {
64986         return '';
64987       }
64988       case 'hr': {
64989         return this.renderer.hr();
64990       }
64991       case 'heading': {
64992         return this.renderer.heading(
64993           this.inline.output(this.token.text),
64994           this.token.depth,
64995           unescape(this.inlineText.output(this.token.text)),
64996           this.slugger);
64997       }
64998       case 'code': {
64999         return this.renderer.code(this.token.text,
65000           this.token.lang,
65001           this.token.escaped);
65002       }
65003       case 'table': {
65004         var header = '',
65005             body = '',
65006             i,
65007             row,
65008             cell,
65009             j;
65010
65011         // header
65012         cell = '';
65013         for (i = 0; i < this.token.header.length; i++) {
65014           cell += this.renderer.tablecell(
65015             this.inline.output(this.token.header[i]),
65016             { header: true, align: this.token.align[i] }
65017           );
65018         }
65019         header += this.renderer.tablerow(cell);
65020
65021         for (i = 0; i < this.token.cells.length; i++) {
65022           row = this.token.cells[i];
65023
65024           cell = '';
65025           for (j = 0; j < row.length; j++) {
65026             cell += this.renderer.tablecell(
65027               this.inline.output(row[j]),
65028               { header: false, align: this.token.align[j] }
65029             );
65030           }
65031
65032           body += this.renderer.tablerow(cell);
65033         }
65034         return this.renderer.table(header, body);
65035       }
65036       case 'blockquote_start': {
65037         body = '';
65038
65039         while (this.next().type !== 'blockquote_end') {
65040           body += this.tok();
65041         }
65042
65043         return this.renderer.blockquote(body);
65044       }
65045       case 'list_start': {
65046         body = '';
65047         var ordered = this.token.ordered,
65048             start = this.token.start;
65049
65050         while (this.next().type !== 'list_end') {
65051           body += this.tok();
65052         }
65053
65054         return this.renderer.list(body, ordered, start);
65055       }
65056       case 'list_item_start': {
65057         body = '';
65058         var loose = this.token.loose;
65059
65060         if (this.token.task) {
65061           body += this.renderer.checkbox(this.token.checked);
65062         }
65063
65064         while (this.next().type !== 'list_item_end') {
65065           body += !loose && this.token.type === 'text'
65066             ? this.parseText()
65067             : this.tok();
65068         }
65069
65070         return this.renderer.listitem(body);
65071       }
65072       case 'html': {
65073         // TODO parse inline content if parameter markdown=1
65074         return this.renderer.html(this.token.text);
65075       }
65076       case 'paragraph': {
65077         return this.renderer.paragraph(this.inline.output(this.token.text));
65078       }
65079       case 'text': {
65080         return this.renderer.paragraph(this.parseText());
65081       }
65082       default: {
65083         var errMsg = 'Token with "' + this.token.type + '" type was not found.';
65084         if (this.options.silent) {
65085           console.log(errMsg);
65086         } else {
65087           throw new Error(errMsg);
65088         }
65089       }
65090     }
65091   };
65092
65093   /**
65094    * Slugger generates header id
65095    */
65096
65097   function Slugger () {
65098     this.seen = {};
65099   }
65100
65101   /**
65102    * Convert string to unique id
65103    */
65104
65105   Slugger.prototype.slug = function (value) {
65106     var slug = value
65107       .toLowerCase()
65108       .trim()
65109       .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '')
65110       .replace(/\s/g, '-');
65111
65112     if (this.seen.hasOwnProperty(slug)) {
65113       var originalSlug = slug;
65114       do {
65115         this.seen[originalSlug]++;
65116         slug = originalSlug + '-' + this.seen[originalSlug];
65117       } while (this.seen.hasOwnProperty(slug));
65118     }
65119     this.seen[slug] = 0;
65120
65121     return slug;
65122   };
65123
65124   /**
65125    * Helpers
65126    */
65127
65128   function escape(html, encode) {
65129     if (encode) {
65130       if (escape.escapeTest.test(html)) {
65131         return html.replace(escape.escapeReplace, function (ch) { return escape.replacements[ch]; });
65132       }
65133     } else {
65134       if (escape.escapeTestNoEncode.test(html)) {
65135         return html.replace(escape.escapeReplaceNoEncode, function (ch) { return escape.replacements[ch]; });
65136       }
65137     }
65138
65139     return html;
65140   }
65141
65142   escape.escapeTest = /[&<>"']/;
65143   escape.escapeReplace = /[&<>"']/g;
65144   escape.replacements = {
65145     '&': '&amp;',
65146     '<': '&lt;',
65147     '>': '&gt;',
65148     '"': '&quot;',
65149     "'": '&#39;'
65150   };
65151
65152   escape.escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
65153   escape.escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
65154
65155   function unescape(html) {
65156     // explicitly match decimal, hex, and named HTML entities
65157     return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
65158       n = n.toLowerCase();
65159       if (n === 'colon') return ':';
65160       if (n.charAt(0) === '#') {
65161         return n.charAt(1) === 'x'
65162           ? String.fromCharCode(parseInt(n.substring(2), 16))
65163           : String.fromCharCode(+n.substring(1));
65164       }
65165       return '';
65166     });
65167   }
65168
65169   function edit(regex, opt) {
65170     regex = regex.source || regex;
65171     opt = opt || '';
65172     return {
65173       replace: function(name, val) {
65174         val = val.source || val;
65175         val = val.replace(/(^|[^\[])\^/g, '$1');
65176         regex = regex.replace(name, val);
65177         return this;
65178       },
65179       getRegex: function() {
65180         return new RegExp(regex, opt);
65181       }
65182     };
65183   }
65184
65185   function cleanUrl(sanitize, base, href) {
65186     if (sanitize) {
65187       try {
65188         var prot = decodeURIComponent(unescape(href))
65189           .replace(/[^\w:]/g, '')
65190           .toLowerCase();
65191       } catch (e) {
65192         return null;
65193       }
65194       if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
65195         return null;
65196       }
65197     }
65198     if (base && !originIndependentUrl.test(href)) {
65199       href = resolveUrl(base, href);
65200     }
65201     try {
65202       href = encodeURI(href).replace(/%25/g, '%');
65203     } catch (e) {
65204       return null;
65205     }
65206     return href;
65207   }
65208
65209   function resolveUrl(base, href) {
65210     if (!baseUrls[' ' + base]) {
65211       // we can ignore everything in base after the last slash of its path component,
65212       // but we might need to add _that_
65213       // https://tools.ietf.org/html/rfc3986#section-3
65214       if (/^[^:]+:\/*[^/]*$/.test(base)) {
65215         baseUrls[' ' + base] = base + '/';
65216       } else {
65217         baseUrls[' ' + base] = rtrim(base, '/', true);
65218       }
65219     }
65220     base = baseUrls[' ' + base];
65221
65222     if (href.slice(0, 2) === '//') {
65223       return base.replace(/:[\s\S]*/, ':') + href;
65224     } else if (href.charAt(0) === '/') {
65225       return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
65226     } else {
65227       return base + href;
65228     }
65229   }
65230   var baseUrls = {};
65231   var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
65232
65233   function noop() {}
65234   noop.exec = noop;
65235
65236   function merge(obj) {
65237     var i = 1,
65238         target,
65239         key;
65240
65241     for (; i < arguments.length; i++) {
65242       target = arguments[i];
65243       for (key in target) {
65244         if (Object.prototype.hasOwnProperty.call(target, key)) {
65245           obj[key] = target[key];
65246         }
65247       }
65248     }
65249
65250     return obj;
65251   }
65252
65253   function splitCells(tableRow, count) {
65254     // ensure that every cell-delimiting pipe has a space
65255     // before it to distinguish it from an escaped pipe
65256     var row = tableRow.replace(/\|/g, function (match, offset, str) {
65257           var escaped = false,
65258               curr = offset;
65259           while (--curr >= 0 && str[curr] === '\\') escaped = !escaped;
65260           if (escaped) {
65261             // odd number of slashes means | is escaped
65262             // so we leave it alone
65263             return '|';
65264           } else {
65265             // add space before unescaped |
65266             return ' |';
65267           }
65268         }),
65269         cells = row.split(/ \|/),
65270         i = 0;
65271
65272     if (cells.length > count) {
65273       cells.splice(count);
65274     } else {
65275       while (cells.length < count) cells.push('');
65276     }
65277
65278     for (; i < cells.length; i++) {
65279       // leading or trailing whitespace is ignored per the gfm spec
65280       cells[i] = cells[i].trim().replace(/\\\|/g, '|');
65281     }
65282     return cells;
65283   }
65284
65285   // Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
65286   // /c*$/ is vulnerable to REDOS.
65287   // invert: Remove suffix of non-c chars instead. Default falsey.
65288   function rtrim(str, c, invert) {
65289     if (str.length === 0) {
65290       return '';
65291     }
65292
65293     // Length of suffix matching the invert condition.
65294     var suffLen = 0;
65295
65296     // Step left until we fail to match the invert condition.
65297     while (suffLen < str.length) {
65298       var currChar = str.charAt(str.length - suffLen - 1);
65299       if (currChar === c && !invert) {
65300         suffLen++;
65301       } else if (currChar !== c && invert) {
65302         suffLen++;
65303       } else {
65304         break;
65305       }
65306     }
65307
65308     return str.substr(0, str.length - suffLen);
65309   }
65310
65311   /**
65312    * Marked
65313    */
65314
65315   function marked(src, opt, callback) {
65316     // throw error in case of non string input
65317     if (typeof src === 'undefined' || src === null) {
65318       throw new Error('marked(): input parameter is undefined or null');
65319     }
65320     if (typeof src !== 'string') {
65321       throw new Error('marked(): input parameter is of type '
65322         + Object.prototype.toString.call(src) + ', string expected');
65323     }
65324
65325     if (callback || typeof opt === 'function') {
65326       if (!callback) {
65327         callback = opt;
65328         opt = null;
65329       }
65330
65331       opt = merge({}, marked.defaults, opt || {});
65332
65333       var highlight = opt.highlight,
65334           tokens,
65335           pending,
65336           i = 0;
65337
65338       try {
65339         tokens = Lexer.lex(src, opt);
65340       } catch (e) {
65341         return callback(e);
65342       }
65343
65344       pending = tokens.length;
65345
65346       var done = function(err) {
65347         if (err) {
65348           opt.highlight = highlight;
65349           return callback(err);
65350         }
65351
65352         var out;
65353
65354         try {
65355           out = Parser.parse(tokens, opt);
65356         } catch (e) {
65357           err = e;
65358         }
65359
65360         opt.highlight = highlight;
65361
65362         return err
65363           ? callback(err)
65364           : callback(null, out);
65365       };
65366
65367       if (!highlight || highlight.length < 3) {
65368         return done();
65369       }
65370
65371       delete opt.highlight;
65372
65373       if (!pending) return done();
65374
65375       for (; i < tokens.length; i++) {
65376         (function(token) {
65377           if (token.type !== 'code') {
65378             return --pending || done();
65379           }
65380           return highlight(token.text, token.lang, function(err, code) {
65381             if (err) return done(err);
65382             if (code == null || code === token.text) {
65383               return --pending || done();
65384             }
65385             token.text = code;
65386             token.escaped = true;
65387             --pending || done();
65388           });
65389         })(tokens[i]);
65390       }
65391
65392       return;
65393     }
65394     try {
65395       if (opt) opt = merge({}, marked.defaults, opt);
65396       return Parser.parse(Lexer.lex(src, opt), opt);
65397     } catch (e) {
65398       e.message += '\nPlease report this to https://github.com/markedjs/marked.';
65399       if ((opt || marked.defaults).silent) {
65400         return '<p>An error occurred:</p><pre>'
65401           + escape(e.message + '', true)
65402           + '</pre>';
65403       }
65404       throw e;
65405     }
65406   }
65407
65408   /**
65409    * Options
65410    */
65411
65412   marked.options =
65413   marked.setOptions = function(opt) {
65414     merge(marked.defaults, opt);
65415     return marked;
65416   };
65417
65418   marked.getDefaults = function () {
65419     return {
65420       baseUrl: null,
65421       breaks: false,
65422       gfm: true,
65423       headerIds: true,
65424       headerPrefix: '',
65425       highlight: null,
65426       langPrefix: 'language-',
65427       mangle: true,
65428       pedantic: false,
65429       renderer: new Renderer(),
65430       sanitize: false,
65431       sanitizer: null,
65432       silent: false,
65433       smartLists: false,
65434       smartypants: false,
65435       tables: true,
65436       xhtml: false
65437     };
65438   };
65439
65440   marked.defaults = marked.getDefaults();
65441
65442   /**
65443    * Expose
65444    */
65445
65446   marked.Parser = Parser;
65447   marked.parser = Parser.parse;
65448
65449   marked.Renderer = Renderer;
65450   marked.TextRenderer = TextRenderer;
65451
65452   marked.Lexer = Lexer;
65453   marked.lexer = Lexer.lex;
65454
65455   marked.InlineLexer = InlineLexer;
65456   marked.inlineLexer = InlineLexer.output;
65457
65458   marked.Slugger = Slugger;
65459
65460   marked.parse = marked;
65461
65462   {
65463     module.exports = marked;
65464   }
65465   })(commonjsGlobal || (typeof window !== 'undefined' ? window : commonjsGlobal));
65466   });
65467
65468   function pointBox(loc, context) {
65469       var rect = context.surfaceRect();
65470       var point = context.curtainProjection(loc);
65471       return {
65472           left: point[0] + rect.left - 40,
65473           top: point[1] + rect.top - 60,
65474           width: 80,
65475           height: 90
65476       };
65477   }
65478
65479
65480   function pad$1(locOrBox, padding, context) {
65481       var box;
65482       if (locOrBox instanceof Array) {
65483           var rect = context.surfaceRect();
65484           var point = context.curtainProjection(locOrBox);
65485           box = {
65486               left: point[0] + rect.left,
65487               top: point[1] + rect.top
65488           };
65489       } else {
65490           box = locOrBox;
65491       }
65492
65493       return {
65494           left: box.left - padding,
65495           top: box.top - padding,
65496           width: (box.width || 0) + 2 * padding,
65497           height: (box.width || 0) + 2 * padding
65498       };
65499   }
65500
65501
65502   function icon(name, svgklass, useklass) {
65503       return '<svg class="icon ' + (svgklass || '') + '">' +
65504            '<use xlink:href="' + name + '"' +
65505            (useklass ? ' class="' + useklass + '"' : '') + '></use></svg>';
65506   }
65507
65508
65509   function slugify(text) {
65510       return text.toString().toLowerCase()
65511           .replace(/\s+/g, '-')           // Replace spaces with -
65512           .replace(/[^\w\-]+/g, '')       // Remove all non-word chars
65513           .replace(/\-\-+/g, '-')         // Replace multiple - with single -
65514           .replace(/^-+/, '')             // Trim - from start of text
65515           .replace(/-+$/, '');            // Trim - from end of text
65516   }
65517
65518
65519   // console warning for missing walkthrough names
65520   var missingStrings = {};
65521   function checkKey(key, text) {
65522       if (t(key, { default: undefined}) === undefined) {
65523           if (missingStrings.hasOwnProperty(key)) return;  // warn once
65524           missingStrings[key] = text;
65525           var missing = key + ': ' + text;
65526           if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
65527       }
65528   }
65529
65530
65531   function localize(obj) {
65532       var key;
65533
65534       // Assign name if entity has one..
65535       var name = obj.tags && obj.tags.name;
65536       if (name) {
65537           key = 'intro.graph.name.' + slugify(name);
65538           obj.tags.name = t(key, { default: name });
65539           checkKey(key, name);
65540       }
65541
65542       // Assign street name if entity has one..
65543       var street = obj.tags && obj.tags['addr:street'];
65544       if (street) {
65545           key = 'intro.graph.name.' + slugify(street);
65546           obj.tags['addr:street'] = t(key, { default: street });
65547           checkKey(key, street);
65548
65549           // Add address details common across walkthrough..
65550           var addrTags = [
65551               'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
65552               'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
65553           ];
65554           addrTags.forEach(function(k) {
65555               var key = 'intro.graph.' + k;
65556               var tag = 'addr:' + k;
65557               var val = obj.tags && obj.tags[tag];
65558               var str = t(key, { default: val });
65559
65560               if (str) {
65561                   if (str.match(/^<.*>$/) !== null) {
65562                       delete obj.tags[tag];
65563                   } else {
65564                       obj.tags[tag] = str;
65565                   }
65566               }
65567           });
65568       }
65569
65570       return obj;
65571   }
65572
65573
65574   // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
65575   function isMostlySquare(points) {
65576       // note: uses 15 here instead of the 12 from actionOrthogonalize because
65577       // actionOrthogonalize can actually straighten some larger angles as it iterates
65578       var threshold = 15; // degrees within right or straight
65579       var lowerBound = Math.cos((90 - threshold) * Math.PI / 180);  // near right
65580       var upperBound = Math.cos(threshold * Math.PI / 180);         // near straight
65581       var mag;
65582
65583       for (var i = 0; i < points.length; i++) {
65584           mag = Math.abs(normalizedDotProduct(i, points));
65585           if (mag > lowerBound && mag < upperBound) {
65586               return false;
65587           }
65588       }
65589
65590       return true;
65591
65592
65593       function normalizedDotProduct(i, points) {
65594           var a = points[(i - 1 + points.length) % points.length];
65595           var b = points[i];
65596           var c = points[(i + 1) % points.length];
65597           var p = subtractPoints(a, b);
65598           var q = subtractPoints(c, b);
65599
65600           p = normalizePoint(p);
65601           q = normalizePoint(q);
65602
65603           return p[0] * q[0] + p[1] * q[1];
65604
65605
65606           function subtractPoints(a, b) {
65607               return [a[0] - b[0], a[1] - b[1]];
65608           }
65609
65610           function normalizePoint(point) {
65611               var vector = [0, 0];
65612               var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
65613               if (length !== 0) {
65614                   vector[0] = point[0] / length;
65615                   vector[1] = point[1] / length;
65616               }
65617               return vector;
65618           }
65619       }
65620   }
65621
65622
65623   function selectMenuItem(operation) {
65624       var selector = '.edit-menu .edit-menu-item-' + operation +
65625           ', .radial-menu .radial-menu-item-' + operation;
65626       return select(selector);
65627   }
65628
65629
65630   function transitionTime(point1, point2) {
65631       var distance = geoSphericalDistance(point1, point2);
65632       if (distance === 0)
65633           return 0;
65634       else if (distance < 80)
65635           return 500;
65636       else
65637           return 1000;
65638   }
65639
65640   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]}};
65641
65642   // Tooltips and svg mask used to highlight certain features
65643   function uiCurtain() {
65644
65645       var surface = select(null),
65646           tooltip = select(null),
65647           darkness = select(null);
65648
65649       function curtain(selection) {
65650           surface = selection
65651               .append('svg')
65652               .attr('id', 'curtain')
65653               .style('z-index', 1000)
65654               .style('pointer-events', 'none')
65655               .style('position', 'absolute')
65656               .style('top', 0)
65657               .style('left', 0);
65658
65659           darkness = surface.append('path')
65660               .attr('x', 0)
65661               .attr('y', 0)
65662               .attr('class', 'curtain-darkness');
65663
65664           select(window).on('resize.curtain', resize);
65665
65666           tooltip = selection.append('div')
65667               .attr('class', 'tooltip')
65668               .style('z-index', 1002);
65669
65670           tooltip
65671               .append('div')
65672               .attr('class', 'tooltip-arrow');
65673
65674           tooltip
65675               .append('div')
65676               .attr('class', 'tooltip-inner');
65677
65678           resize();
65679
65680
65681           function resize() {
65682               surface
65683                   .attr('width', window.innerWidth)
65684                   .attr('height', window.innerHeight);
65685               curtain.cut(darkness.datum());
65686           }
65687       }
65688
65689
65690       /**
65691        * Reveal cuts the curtain to highlight the given box,
65692        * and shows a tooltip with instructions next to the box.
65693        *
65694        * @param  {String|ClientRect} [box]   box used to cut the curtain
65695        * @param  {String}    [text]          text for a tooltip
65696        * @param  {Object}    [options]
65697        * @param  {string}    [options.tooltipClass]    optional class to add to the tooltip
65698        * @param  {integer}   [options.duration]        transition time in milliseconds
65699        * @param  {string}    [options.buttonText]      if set, create a button with this text label
65700        * @param  {function}  [options.buttonCallback]  if set, the callback for the button
65701        * @param  {String|ClientRect} [options.tooltipBox]  box for tooltip position, if different from box for the curtain
65702        */
65703       curtain.reveal = function(box, text, options) {
65704           if (typeof box === 'string') {
65705               box = select(box).node();
65706           }
65707           if (box && box.getBoundingClientRect) {
65708               box = copyBox(box.getBoundingClientRect());
65709           }
65710
65711           options = options || {};
65712
65713           var tooltipBox;
65714           if (options.tooltipBox) {
65715               tooltipBox = options.tooltipBox;
65716               if (typeof tooltipBox === 'string') {
65717                   tooltipBox = select(tooltipBox).node();
65718               }
65719               if (tooltipBox && tooltipBox.getBoundingClientRect) {
65720                   tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
65721               }
65722           } else {
65723               tooltipBox = box;
65724           }
65725
65726           if (tooltipBox && text) {
65727               // pseudo markdown bold text for the instruction section..
65728               var parts = text.split('**');
65729               var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
65730               if (parts[1]) {
65731                   html += '<span class="instruction">' + parts[1] + '</span>';
65732               }
65733
65734               html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');   // emphasis
65735               html = html.replace(/\{br\}/g, '<br/><br/>');       // linebreak
65736
65737               if (options.buttonText && options.buttonCallback) {
65738                   html += '<div class="button-section">' +
65739                       '<button href="#" class="button action col8">' + options.buttonText + '</button></div>';
65740               }
65741
65742               var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
65743               tooltip
65744                   .classed(classes, true)
65745                   .selectAll('.tooltip-inner')
65746                   .html(html);
65747
65748               if (options.buttonText && options.buttonCallback) {
65749                   var button = tooltip.selectAll('.button-section .button.action');
65750                   button
65751                       .on('click', function() {
65752                           event.preventDefault();
65753                           options.buttonCallback();
65754                       });
65755               }
65756
65757               var tip = copyBox(tooltip.node().getBoundingClientRect()),
65758                   w = window.innerWidth,
65759                   h = window.innerHeight,
65760                   tooltipWidth = 200,
65761                   tooltipArrow = 5,
65762                   side, pos;
65763
65764
65765               // hack: this will have bottom placement,
65766               // so need to reserve extra space for the tooltip illustration.
65767               if (options.tooltipClass === 'intro-mouse') {
65768                   tip.height += 80;
65769               }
65770
65771               // trim box dimensions to just the portion that fits in the window..
65772               if (tooltipBox.top + tooltipBox.height > h) {
65773                   tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
65774               }
65775               if (tooltipBox.left + tooltipBox.width > w) {
65776                   tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
65777               }
65778
65779               // determine tooltip placement..
65780
65781               if (tooltipBox.top + tooltipBox.height < 100) {
65782                   // tooltip below box..
65783                   side = 'bottom';
65784                   pos = [
65785                       tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
65786                       tooltipBox.top + tooltipBox.height
65787                   ];
65788
65789               } else if (tooltipBox.top > h - 140) {
65790                   // tooltip above box..
65791                   side = 'top';
65792                   pos = [
65793                       tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
65794                       tooltipBox.top - tip.height
65795                   ];
65796
65797               } else {
65798                   // tooltip to the side of the tooltipBox..
65799                   var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
65800
65801                   if (textDirection === 'rtl') {
65802                       if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
65803                           side = 'right';
65804                           pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
65805
65806                       } else {
65807                           side = 'left';
65808                           pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
65809                       }
65810
65811                   } else {
65812                       if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
65813                           side = 'left';
65814                           pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
65815                       }
65816                       else {
65817                           side = 'right';
65818                           pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
65819                       }
65820                   }
65821               }
65822
65823               if (options.duration !== 0 || !tooltip.classed(side)) {
65824                   tooltip.call(uiToggle(true));
65825               }
65826
65827               tooltip
65828                   .style('top', pos[1] + 'px')
65829                   .style('left', pos[0] + 'px')
65830                   .attr('class', classes + ' ' + side);
65831
65832
65833               // shift tooltip-inner if it is very close to the top or bottom edge
65834               // (doesn't affect the placement of the tooltip-arrow)
65835               var shiftY = 0;
65836               if (side === 'left' || side === 'right') {
65837                   if (pos[1] < 60) {
65838                       shiftY = 60 - pos[1];
65839                   }
65840                   else if (pos[1] + tip.height > h - 100) {
65841                       shiftY = h - pos[1] - tip.height - 100;
65842                   }
65843               }
65844               tooltip.selectAll('.tooltip-inner')
65845                   .style('top', shiftY + 'px');
65846
65847           } else {
65848               tooltip
65849                   .classed('in', false)
65850                   .call(uiToggle(false));
65851           }
65852
65853           curtain.cut(box, options.duration);
65854
65855           return tooltip;
65856       };
65857
65858
65859       curtain.cut = function(datum, duration) {
65860           darkness.datum(datum)
65861               .interrupt();
65862
65863           var selection;
65864           if (duration === 0) {
65865               selection = darkness;
65866           } else {
65867               selection = darkness
65868                   .transition()
65869                   .duration(duration || 600)
65870                   .ease(linear$1);
65871           }
65872
65873           selection
65874               .attr('d', function(d) {
65875                   var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
65876                       window.innerWidth + ',' + window.innerHeight + 'L' +
65877                       window.innerWidth + ',0 Z';
65878
65879                   if (!d) return string;
65880                   return string + 'M' +
65881                       d.left + ',' + d.top + 'L' +
65882                       d.left + ',' + (d.top + d.height) + 'L' +
65883                       (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
65884                       (d.left + d.width) + ',' + (d.top) + 'Z';
65885
65886               });
65887       };
65888
65889
65890       curtain.remove = function() {
65891           surface.remove();
65892           tooltip.remove();
65893           select(window).on('resize.curtain', null);
65894       };
65895
65896
65897       // ClientRects are immutable, so copy them to an object,
65898       // in case we need to trim the height/width.
65899       function copyBox(src) {
65900           return {
65901               top: src.top,
65902               right: src.right,
65903               bottom: src.bottom,
65904               left: src.left,
65905               width: src.width,
65906               height: src.height
65907           };
65908       }
65909
65910
65911       return curtain;
65912   }
65913
65914   function uiIntroWelcome(context, reveal) {
65915       var dispatch$1 = dispatch('done');
65916       var listener = clickListener();
65917
65918       var chapter = {
65919           title: 'intro.welcome.title'
65920       };
65921
65922
65923       function welcome() {
65924           context.map().centerZoom([-85.63591, 41.94285], 19);
65925           reveal('.intro-nav-wrap .chapter-welcome',
65926               t('intro.welcome.welcome'),
65927               { buttonText: t('intro.ok'), buttonCallback: practice }
65928           );
65929       }
65930
65931       function practice() {
65932           reveal('.intro-nav-wrap .chapter-welcome',
65933               t('intro.welcome.practice'),
65934               { buttonText: t('intro.ok'), buttonCallback: words }
65935           );
65936       }
65937
65938       function words() {
65939           reveal('.intro-nav-wrap .chapter-welcome',
65940               t('intro.welcome.words'),
65941               { buttonText: t('intro.ok'), buttonCallback: mouse }
65942           );
65943       }
65944
65945
65946       function mouse() {
65947           reveal('.intro-nav-wrap .chapter-welcome',
65948               t('intro.welcome.mouse'),
65949               { buttonText: t('intro.ok'), buttonCallback: leftClick }
65950           );
65951       }
65952
65953
65954       function leftClick() {
65955           var counter = 0;
65956           var times = 5;
65957
65958           var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
65959               t('intro.welcome.leftclick', { num: times }),
65960               { tooltipClass: 'intro-mouse' }
65961           );
65962
65963           tooltip.selectAll('.tooltip-inner')
65964               .insert('svg', 'span')
65965               .attr('class', 'tooltip-illustration')
65966               .append('use')
65967               .attr('xlink:href', '#iD-walkthrough-mouse');
65968
65969           tooltip
65970               .append('div')
65971               .attr('class', 'counter');
65972
65973           tooltip.call(listener);
65974
65975           listener.on('click', function(which) {
65976               if (which === 'left') {
65977                   select('.curtain-tooltip.intro-mouse .counter')
65978                       .text(String(++counter));
65979
65980                   if (counter === times) {
65981                       window.setTimeout(function() { continueTo(rightClick); }, 1000);
65982                   }
65983               }
65984           });
65985
65986           function continueTo(nextStep) {
65987               listener.on('click', null);
65988               tooltip.call(listener.off);
65989               tooltip.select('.counter').remove();
65990               nextStep();
65991           }
65992       }
65993
65994
65995       function rightClick() {
65996           var counter = 0;
65997           var times = 5;
65998
65999           var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
66000               t('intro.welcome.rightclick', { num: times }),
66001               { tooltipClass: 'intro-mouse' }
66002           );
66003
66004           tooltip.selectAll('.tooltip-inner')
66005               .insert('svg', 'span')
66006               .attr('class', 'tooltip-illustration')
66007               .append('use')
66008               .attr('xlink:href', '#iD-walkthrough-mouse');
66009
66010           tooltip
66011               .append('div')
66012               .attr('class', 'counter');
66013
66014           tooltip.call(listener);
66015
66016           listener.on('click', function(which) {
66017               if (which === 'right') {
66018                   select('.curtain-tooltip.intro-mouse .counter')
66019                       .text(String(++counter));
66020
66021                   if (counter === times) {
66022                       window.setTimeout(function() { continueTo(chapters); }, 1000);
66023                   }
66024               }
66025           });
66026
66027           function continueTo(nextStep) {
66028               listener.on('click', null);
66029               tooltip.call(listener.off);
66030               tooltip.select('.counter').remove();
66031               nextStep();
66032           }
66033       }
66034
66035
66036       function chapters() {
66037           dispatch$1.call('done');
66038           reveal('.intro-nav-wrap .chapter-navigation',
66039               t('intro.welcome.chapters', { next: t('intro.navigation.title') })
66040           );
66041       }
66042
66043
66044       chapter.enter = function() {
66045           welcome();
66046       };
66047
66048
66049       chapter.exit = function() {
66050           listener.off();
66051           select('.curtain-tooltip.intro-mouse')
66052               .selectAll('.counter')
66053               .remove();
66054       };
66055
66056
66057       chapter.restart = function() {
66058           chapter.exit();
66059           chapter.enter();
66060       };
66061
66062
66063       return utilRebind(chapter, dispatch$1, 'on');
66064   }
66065
66066
66067
66068   function clickListener() {
66069       var dispatch$1 = dispatch('click');
66070       var minTime = 120;
66071       var tooltip = select(null);
66072       var down = {};
66073
66074       // `down` keeps track of which buttons/keys are down.
66075       // Setting a property in `down` happens immediately.
66076       // Unsetting a property in `down` is delayed because
66077       //   on Windows a contextmenu event happens after keyup/mouseup
66078
66079       function keydown() {
66080           if (event.keyCode === 93)  {   // context menu
66081               event.preventDefault();
66082               event.stopPropagation();
66083               down.menu = event.timeStamp;
66084               tooltip.classed('rightclick', true);
66085           }
66086       }
66087
66088
66089       function keyup() {
66090           if (event.keyCode === 93)  {   // context menu
66091               event.preventDefault();
66092               event.stopPropagation();
66093               var endTime = event.timeStamp;
66094               var startTime = down.menu || endTime;
66095               var delay = (endTime - startTime < minTime) ? minTime : 0;
66096
66097               window.setTimeout(function() {
66098                   tooltip.classed('rightclick', false);
66099                   down.menu = undefined;  // delayed, for Windows
66100               }, delay);
66101
66102               dispatch$1.call('click', this, 'right');
66103           }
66104       }
66105
66106
66107       function mousedown() {
66108           var button = event.button;
66109           if (button === 0 && !event.ctrlKey) {
66110               tooltip.classed('leftclick', true);
66111           } else if (button === 2) {
66112               tooltip.classed('rightclick', true);
66113           }
66114           down[button] = event.timeStamp;
66115       }
66116
66117
66118       function mouseup() {
66119           var button = event.button;
66120           var endTime = event.timeStamp;
66121           var startTime = down[button] || endTime;
66122           var delay = (endTime - startTime < minTime) ? minTime : 0;
66123
66124           if (button === 0 && !event.ctrlKey) {
66125               window.setTimeout(function() {
66126                   tooltip.classed('leftclick', false);
66127                   down[button] = undefined;  // delayed, for Windows
66128               }, delay);
66129
66130               dispatch$1.call('click', this, 'left');
66131
66132           } else if (button === 2) {
66133               window.setTimeout(function() {
66134                   tooltip.classed('rightclick', false);
66135                   down[button] = undefined;  // delayed, for Windows
66136               }, delay);
66137
66138               dispatch$1.call('click', this, 'right');
66139
66140           } else {
66141               window.setTimeout(function() {
66142                   down[button] = undefined;  // delayed, for Windows
66143               }, delay);
66144           }
66145       }
66146
66147
66148       function contextmenu() {
66149           event.preventDefault();
66150           event.stopPropagation();
66151           if (!down[2] && !down.menu) {
66152               tooltip.classed('rightclick', true);
66153               window.setTimeout(function() {
66154                   tooltip.classed('rightclick', false);
66155               }, minTime);
66156               dispatch$1.call('click', this, 'right');
66157           }
66158       }
66159
66160
66161       var behavior = function(selection) {
66162           tooltip = selection;
66163           down = {};
66164
66165           select(window)
66166               .on('keydown.intro', keydown)
66167               .on('keyup.intro', keyup)
66168               .on('mousedown.intro', mousedown)
66169               .on('mouseup.intro', mouseup)
66170               .on('contextmenu.intro', contextmenu);
66171       };
66172
66173
66174       behavior.off = function() {
66175           select(window)
66176               .on('keydown.intro', null)
66177               .on('keyup.intro', null)
66178               .on('mousedown.intro', null)
66179               .on('mouseup.intro', null)
66180               .on('contextmenu.intro', null);
66181
66182           tooltip
66183               .classed('leftclick', false)
66184               .classed('rightclick', false);
66185       };
66186
66187       return utilRebind(behavior, dispatch$1, 'on');
66188   }
66189
66190   function uiIntroNavigation(context, reveal) {
66191       var dispatch$1 = dispatch('done');
66192       var timeouts = [];
66193       var hallId = 'n2061';
66194       var townHall = [-85.63591, 41.94285];
66195       var springStreetId = 'w397';
66196       var springStreetEndId = 'n1834';
66197       var springStreet = [-85.63582, 41.94255];
66198       var onewayField = context.presets().field('oneway');
66199       var maxspeedField = context.presets().field('maxspeed');
66200
66201
66202       var chapter = {
66203           title: 'intro.navigation.title'
66204       };
66205
66206
66207       function timeout(f, t) {
66208           timeouts.push(window.setTimeout(f, t));
66209       }
66210
66211
66212       function eventCancel() {
66213           event.stopPropagation();
66214           event.preventDefault();
66215       }
66216
66217
66218       function isTownHallSelected() {
66219           var ids = context.selectedIDs();
66220           return ids.length === 1 && ids[0] === hallId;
66221       }
66222
66223
66224       function dragMap() {
66225           context.enter(modeBrowse(context));
66226           context.history().reset('initial');
66227
66228           var msec = transitionTime(townHall, context.map().center());
66229           if (msec) { reveal(null, null, { duration: 0 }); }
66230           context.map().centerZoomEase(townHall, 19, msec);
66231
66232           timeout(function() {
66233               var centerStart = context.map().center();
66234
66235               reveal('#surface', t('intro.navigation.drag'));
66236               context.map().on('drawn.intro', function() {
66237                   reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
66238               });
66239
66240               context.map().on('move.intro', function() {
66241                   var centerNow = context.map().center();
66242                   if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
66243                       context.map().on('move.intro', null);
66244                       timeout(function() { continueTo(zoomMap); }, 3000);
66245                   }
66246               });
66247
66248           }, msec + 100);
66249
66250           function continueTo(nextStep) {
66251               context.map().on('move.intro drawn.intro', null);
66252               nextStep();
66253           }
66254       }
66255
66256
66257       function zoomMap() {
66258           var zoomStart = context.map().zoom();
66259
66260           reveal('#surface',
66261               t('intro.navigation.zoom', {
66262                   plus: icon('#iD-icon-plus', 'pre-text'),
66263                   minus: icon('#iD-icon-minus', 'pre-text')
66264               })
66265           );
66266
66267           context.map().on('drawn.intro', function() {
66268               reveal('#surface',
66269                   t('intro.navigation.zoom', {
66270                       plus: icon('#iD-icon-plus', 'pre-text'),
66271                       minus: icon('#iD-icon-minus', 'pre-text')
66272                   }), { duration: 0 }
66273               );
66274           });
66275
66276           context.map().on('move.intro', function() {
66277               if (context.map().zoom() !== zoomStart) {
66278                   context.map().on('move.intro', null);
66279                   timeout(function() { continueTo(features); }, 3000);
66280               }
66281           });
66282
66283           function continueTo(nextStep) {
66284               context.map().on('move.intro drawn.intro', null);
66285               nextStep();
66286           }
66287       }
66288
66289
66290       function features() {
66291           var onClick = function() { continueTo(pointsLinesAreas); };
66292
66293           reveal('#surface', t('intro.navigation.features'),
66294               { buttonText: t('intro.ok'), buttonCallback: onClick }
66295           );
66296
66297           context.map().on('drawn.intro', function() {
66298               reveal('#surface', t('intro.navigation.features'),
66299                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
66300               );
66301           });
66302
66303           function continueTo(nextStep) {
66304               context.map().on('drawn.intro', null);
66305               nextStep();
66306           }
66307       }
66308
66309       function pointsLinesAreas() {
66310           var onClick = function() { continueTo(nodesWays); };
66311
66312           reveal('#surface', t('intro.navigation.points_lines_areas'),
66313               { buttonText: t('intro.ok'), buttonCallback: onClick }
66314           );
66315
66316           context.map().on('drawn.intro', function() {
66317               reveal('#surface', t('intro.navigation.points_lines_areas'),
66318                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
66319               );
66320           });
66321
66322           function continueTo(nextStep) {
66323               context.map().on('drawn.intro', null);
66324               nextStep();
66325           }
66326       }
66327
66328       function nodesWays() {
66329           var onClick = function() { continueTo(clickTownHall); };
66330
66331           reveal('#surface', t('intro.navigation.nodes_ways'),
66332               { buttonText: t('intro.ok'), buttonCallback: onClick }
66333           );
66334
66335           context.map().on('drawn.intro', function() {
66336               reveal('#surface', t('intro.navigation.nodes_ways'),
66337                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
66338               );
66339           });
66340
66341           function continueTo(nextStep) {
66342               context.map().on('drawn.intro', null);
66343               nextStep();
66344           }
66345       }
66346
66347       function clickTownHall() {
66348           context.enter(modeBrowse(context));
66349           context.history().reset('initial');
66350
66351           var entity = context.hasEntity(hallId);
66352           if (!entity) return;
66353           reveal(null, null, { duration: 0 });
66354           context.map().centerZoomEase(entity.loc, 19, 500);
66355
66356           timeout(function() {
66357               var entity = context.hasEntity(hallId);
66358               if (!entity) return;
66359               var box = pointBox(entity.loc, context);
66360               reveal(box, t('intro.navigation.click_townhall'));
66361
66362               context.map().on('move.intro drawn.intro', function() {
66363                   var entity = context.hasEntity(hallId);
66364                   if (!entity) return;
66365                   var box = pointBox(entity.loc, context);
66366                   reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
66367               });
66368
66369               context.on('enter.intro', function() {
66370                   if (isTownHallSelected()) continueTo(selectedTownHall);
66371               });
66372
66373           }, 550);  // after centerZoomEase
66374
66375           context.history().on('change.intro', function() {
66376               if (!context.hasEntity(hallId)) {
66377                   continueTo(clickTownHall);
66378               }
66379           });
66380
66381           function continueTo(nextStep) {
66382               context.on('enter.intro', null);
66383               context.map().on('move.intro drawn.intro', null);
66384               context.history().on('change.intro', null);
66385               nextStep();
66386           }
66387       }
66388
66389
66390       function selectedTownHall() {
66391           if (!isTownHallSelected()) return clickTownHall();
66392
66393           var entity = context.hasEntity(hallId);
66394           if (!entity) return clickTownHall();
66395
66396           var box = pointBox(entity.loc, context);
66397           var onClick = function() { continueTo(editorTownHall); };
66398
66399           reveal(box, t('intro.navigation.selected_townhall'),
66400               { buttonText: t('intro.ok'), buttonCallback: onClick }
66401           );
66402
66403           context.map().on('move.intro drawn.intro', function() {
66404               var entity = context.hasEntity(hallId);
66405               if (!entity) return;
66406               var box = pointBox(entity.loc, context);
66407               reveal(box, t('intro.navigation.selected_townhall'),
66408                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
66409               );
66410           });
66411
66412           context.history().on('change.intro', function() {
66413               if (!context.hasEntity(hallId)) {
66414                   continueTo(clickTownHall);
66415               }
66416           });
66417
66418           function continueTo(nextStep) {
66419               context.map().on('move.intro drawn.intro', null);
66420               context.history().on('change.intro', null);
66421               nextStep();
66422           }
66423       }
66424
66425
66426       function editorTownHall() {
66427           if (!isTownHallSelected()) return clickTownHall();
66428
66429           // disallow scrolling
66430           select('.inspector-wrap').on('wheel.intro', eventCancel);
66431
66432           var onClick = function() { continueTo(presetTownHall); };
66433
66434           reveal('.entity-editor-pane',
66435               t('intro.navigation.editor_townhall'),
66436               { buttonText: t('intro.ok'), buttonCallback: onClick }
66437           );
66438
66439           context.on('exit.intro', function() {
66440               continueTo(clickTownHall);
66441           });
66442
66443           context.history().on('change.intro', function() {
66444               if (!context.hasEntity(hallId)) {
66445                   continueTo(clickTownHall);
66446               }
66447           });
66448
66449           function continueTo(nextStep) {
66450               context.on('exit.intro', null);
66451               context.history().on('change.intro', null);
66452               select('.inspector-wrap').on('wheel.intro', null);
66453               nextStep();
66454           }
66455       }
66456
66457
66458       function presetTownHall() {
66459           if (!isTownHallSelected()) return clickTownHall();
66460
66461           // reset pane, in case user happened to change it..
66462           select('.inspector-wrap .panewrap').style('right', '0%');
66463           // disallow scrolling
66464           select('.inspector-wrap').on('wheel.intro', eventCancel);
66465
66466           // preset match, in case the user happened to change it.
66467           var entity = context.entity(context.selectedIDs()[0]);
66468           var preset = context.presets().match(entity, context.graph());
66469
66470           var onClick = function() { continueTo(fieldsTownHall); };
66471
66472           context.on('exit.intro', function() {
66473               continueTo(clickTownHall);
66474           });
66475
66476           context.history().on('change.intro', function() {
66477               if (!context.hasEntity(hallId)) {
66478                   continueTo(clickTownHall);
66479               }
66480           });
66481
66482           reveal('.inspector-body .preset-list-item.inspector-inner',
66483               t('intro.navigation.preset_townhall', { preset: preset.name() }),
66484               { buttonText: t('intro.ok'), buttonCallback: onClick }
66485           );
66486
66487           function continueTo(nextStep) {
66488               context.on('exit.intro', null);
66489               context.history().on('change.intro', null);
66490               select('.inspector-wrap').on('wheel.intro', null);
66491               nextStep();
66492           }
66493       }
66494
66495
66496       function fieldsTownHall() {
66497           if (!isTownHallSelected()) return clickTownHall();
66498
66499           // reset pane, in case user happened to change it..
66500           select('.inspector-wrap .panewrap').style('right', '0%');
66501           // disallow scrolling
66502           select('.inspector-wrap').on('wheel.intro', eventCancel);
66503
66504           var onClick = function() { continueTo(closeTownHall); };
66505
66506           reveal('.inspector-body .preset-editor',
66507               t('intro.navigation.fields_townhall'),
66508               { buttonText: t('intro.ok'), buttonCallback: onClick }
66509           );
66510
66511           context.on('exit.intro', function() {
66512               continueTo(clickTownHall);
66513           });
66514
66515           context.history().on('change.intro', function() {
66516               if (!context.hasEntity(hallId)) {
66517                   continueTo(clickTownHall);
66518               }
66519           });
66520
66521           function continueTo(nextStep) {
66522               context.on('exit.intro', null);
66523               context.history().on('change.intro', null);
66524               select('.inspector-wrap').on('wheel.intro', null);
66525               nextStep();
66526           }
66527       }
66528
66529
66530       function closeTownHall() {
66531           if (!isTownHallSelected()) return clickTownHall();
66532
66533           var selector = '.entity-editor-pane button.preset-close svg use';
66534           var href = select(selector).attr('href') || '#iD-icon-close';
66535
66536           reveal('.entity-editor-pane',
66537               t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
66538           );
66539
66540           context.on('exit.intro', function() {
66541               continueTo(searchStreet);
66542           });
66543
66544           context.history().on('change.intro', function() {
66545               // update the close icon in the tooltip if the user edits something.
66546               var selector = '.entity-editor-pane button.preset-close svg use';
66547               var href = select(selector).attr('href') || '#iD-icon-close';
66548
66549               reveal('.entity-editor-pane',
66550                   t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
66551                   { duration: 0 }
66552               );
66553           });
66554
66555           function continueTo(nextStep) {
66556               context.on('exit.intro', null);
66557               context.history().on('change.intro', null);
66558               nextStep();
66559           }
66560       }
66561
66562
66563       function searchStreet() {
66564           context.enter(modeBrowse(context));
66565           context.history().reset('initial');  // ensure spring street exists
66566
66567           var msec = transitionTime(springStreet, context.map().center());
66568           if (msec) { reveal(null, null, { duration: 0 }); }
66569           context.map().centerZoomEase(springStreet, 19, msec);  // ..and user can see it
66570
66571           timeout(function() {
66572               reveal('.search-header input',
66573                   t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
66574               );
66575
66576               select('.search-header input')
66577                   .on('keyup.intro', checkSearchResult);
66578           }, msec + 100);
66579       }
66580
66581
66582       function checkSearchResult() {
66583           var first = select('.feature-list-item:nth-child(0n+2)');  // skip "No Results" item
66584           var firstName = first.select('.entity-name');
66585           var name = t('intro.graph.name.spring-street');
66586
66587           if (!firstName.empty() && firstName.text() === name) {
66588               reveal(first.node(),
66589                   t('intro.navigation.choose_street', { name: name }),
66590                   { duration: 300 }
66591               );
66592
66593               context.on('exit.intro', function() {
66594                   continueTo(selectedStreet);
66595               });
66596
66597               select('.search-header input')
66598                   .on('keydown.intro', eventCancel, true)
66599                   .on('keyup.intro', null);
66600           }
66601
66602           function continueTo(nextStep) {
66603               context.on('exit.intro', null);
66604               select('.search-header input')
66605                   .on('keydown.intro', null)
66606                   .on('keyup.intro', null);
66607               nextStep();
66608           }
66609       }
66610
66611
66612       function selectedStreet() {
66613           if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
66614               return searchStreet();
66615           }
66616
66617           var onClick = function() { continueTo(editorStreet); };
66618           var entity = context.entity(springStreetEndId);
66619           var box = pointBox(entity.loc, context);
66620           box.height = 500;
66621
66622           reveal(box,
66623               t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
66624               { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
66625           );
66626
66627           timeout(function() {
66628               context.map().on('move.intro drawn.intro', function() {
66629                   var entity = context.hasEntity(springStreetEndId);
66630                   if (!entity) return;
66631                   var box = pointBox(entity.loc, context);
66632                   box.height = 500;
66633                   reveal(box,
66634                       t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
66635                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
66636                   );
66637               });
66638           }, 600);  // after reveal.
66639
66640           context.on('enter.intro', function(mode) {
66641               if (!context.hasEntity(springStreetId)) {
66642                   return continueTo(searchStreet);
66643               }
66644               var ids = context.selectedIDs();
66645               if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
66646                   // keep Spring Street selected..
66647                   context.enter(modeSelect(context, [springStreetId]));
66648               }
66649           });
66650
66651           context.history().on('change.intro', function() {
66652               if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
66653                   timeout(function() {
66654                       continueTo(searchStreet);
66655                   }, 300);  // after any transition (e.g. if user deleted intersection)
66656               }
66657           });
66658
66659           function continueTo(nextStep) {
66660               context.map().on('move.intro drawn.intro', null);
66661               context.on('enter.intro', null);
66662               context.history().on('change.intro', null);
66663               nextStep();
66664           }
66665       }
66666
66667
66668       function editorStreet() {
66669           var selector = '.entity-editor-pane button.preset-close svg use';
66670           var href = select(selector).attr('href') || '#iD-icon-close';
66671
66672           reveal('.entity-editor-pane',
66673               t('intro.navigation.editor_street', {
66674                   button: icon(href, 'pre-text'),
66675                   field1: onewayField.label(),
66676                   field2: maxspeedField.label()
66677               })
66678           );
66679
66680           context.on('exit.intro', function() {
66681               continueTo(play);
66682           });
66683
66684           context.history().on('change.intro', function() {
66685               // update the close icon in the tooltip if the user edits something.
66686               var selector = '.entity-editor-pane button.preset-close svg use';
66687               var href = select(selector).attr('href') || '#iD-icon-close';
66688
66689               reveal('.entity-editor-pane',
66690                   t('intro.navigation.editor_street', {
66691                       button: icon(href, 'pre-text'),
66692                       field1: onewayField.label().toLowerCase(),
66693                       field2: maxspeedField.label().toLowerCase()
66694                   }), { duration: 0 }
66695               );
66696           });
66697
66698           function continueTo(nextStep) {
66699               context.on('exit.intro', null);
66700               context.history().on('change.intro', null);
66701               nextStep();
66702           }
66703       }
66704
66705
66706       function play() {
66707           dispatch$1.call('done');
66708           reveal('#id-container',
66709               t('intro.navigation.play', { next: t('intro.points.title') }), {
66710                   tooltipBox: '.intro-nav-wrap .chapter-point',
66711                   buttonText: t('intro.ok'),
66712                   buttonCallback: function() { reveal('#id-container'); }
66713               }
66714           );
66715       }
66716
66717
66718       chapter.enter = function() {
66719           dragMap();
66720       };
66721
66722
66723       chapter.exit = function() {
66724           timeouts.forEach(window.clearTimeout);
66725           context.on('enter.intro exit.intro', null);
66726           context.map().on('move.intro drawn.intro', null);
66727           context.history().on('change.intro', null);
66728           select('.inspector-wrap').on('wheel.intro', null);
66729           select('.search-header input').on('keydown.intro keyup.intro', null);
66730       };
66731
66732
66733       chapter.restart = function() {
66734           chapter.exit();
66735           chapter.enter();
66736       };
66737
66738
66739       return utilRebind(chapter, dispatch$1, 'on');
66740   }
66741
66742   function uiIntroPoint(context, reveal) {
66743       var dispatch$1 = dispatch('done');
66744       var timeouts = [];
66745       var intersection = [-85.63279, 41.94394];
66746       var building = [-85.632422, 41.944045];
66747       var cafePreset = context.presets().item('amenity/cafe');
66748       var _pointID = null;
66749
66750
66751       var chapter = {
66752           title: 'intro.points.title'
66753       };
66754
66755
66756       function timeout(f, t) {
66757           timeouts.push(window.setTimeout(f, t));
66758       }
66759
66760
66761       function revealEditMenu(loc, text, options) {
66762           var rect = context.surfaceRect();
66763           var point = context.curtainProjection(loc);
66764           var pad = 40;
66765           var width = 250 + (2 * pad);
66766           var height = 250;
66767           var startX = rect.left + point[0];
66768           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
66769           var box = {
66770               left: left,
66771               top: point[1] + rect.top - 60,
66772               width: width,
66773               height: height
66774           };
66775           reveal(box, text, options);
66776       }
66777
66778
66779       function eventCancel() {
66780           event.stopPropagation();
66781           event.preventDefault();
66782       }
66783
66784
66785       function addPoint() {
66786           context.enter(modeBrowse(context));
66787           context.history().reset('initial');
66788
66789           var msec = transitionTime(intersection, context.map().center());
66790           if (msec) { reveal(null, null, { duration: 0 }); }
66791           context.map().centerZoomEase(intersection, 19, msec);
66792
66793           timeout(function() {
66794               var tooltip = reveal('button.add-point',
66795                   t('intro.points.add_point', { button: icon('#iD-icon-point', 'pre-text') }));
66796
66797               _pointID = null;
66798
66799               tooltip.selectAll('.tooltip-inner')
66800                   .insert('svg', 'span')
66801                   .attr('class', 'tooltip-illustration')
66802                   .append('use')
66803                   .attr('xlink:href', '#iD-graphic-points');
66804
66805               context.on('enter.intro', function(mode) {
66806                   if (mode.id !== 'add-point') return;
66807                   continueTo(placePoint);
66808               });
66809           }, msec + 100);
66810
66811           function continueTo(nextStep) {
66812               context.on('enter.intro', null);
66813               nextStep();
66814           }
66815       }
66816
66817
66818       function placePoint() {
66819           if (context.mode().id !== 'add-point') {
66820               return chapter.restart();
66821           }
66822
66823           var pointBox = pad$1(building, 150, context);
66824           reveal(pointBox, t('intro.points.place_point'));
66825
66826           context.map().on('move.intro drawn.intro', function() {
66827               pointBox = pad$1(building, 150, context);
66828               reveal(pointBox, t('intro.points.place_point'), { duration: 0 });
66829           });
66830
66831           context.on('enter.intro', function(mode) {
66832               if (mode.id !== 'select') return chapter.restart();
66833               _pointID = context.mode().selectedIDs()[0];
66834               continueTo(searchPreset);
66835           });
66836
66837           function continueTo(nextStep) {
66838               context.map().on('move.intro drawn.intro', null);
66839               context.on('enter.intro', null);
66840               nextStep();
66841           }
66842       }
66843
66844
66845       function searchPreset() {
66846           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
66847               return addPoint();
66848           }
66849
66850           // disallow scrolling
66851           select('.inspector-wrap').on('wheel.intro', eventCancel);
66852
66853           select('.preset-search-input')
66854               .on('keydown.intro', null)
66855               .on('keyup.intro', checkPresetSearch);
66856
66857           reveal('.preset-search-input',
66858               t('intro.points.search_cafe', { preset: cafePreset.name() })
66859           );
66860
66861           context.on('enter.intro', function(mode) {
66862               if (!_pointID || !context.hasEntity(_pointID)) {
66863                   return continueTo(addPoint);
66864               }
66865
66866               var ids = context.selectedIDs();
66867               if (mode.id !== 'select' || !ids.length || ids[0] !== _pointID) {
66868                   // keep the user's point selected..
66869                   context.enter(modeSelect(context, [_pointID]));
66870
66871                   // disallow scrolling
66872                   select('.inspector-wrap').on('wheel.intro', eventCancel);
66873
66874                   select('.preset-search-input')
66875                       .on('keydown.intro', null)
66876                       .on('keyup.intro', checkPresetSearch);
66877
66878                   reveal('.preset-search-input',
66879                       t('intro.points.search_cafe', { preset: cafePreset.name() })
66880                   );
66881
66882                   context.history().on('change.intro', null);
66883               }
66884           });
66885
66886
66887           function checkPresetSearch() {
66888               var first = select('.preset-list-item:first-child');
66889
66890               if (first.classed('preset-amenity-cafe')) {
66891                   select('.preset-search-input')
66892                       .on('keydown.intro', eventCancel, true)
66893                       .on('keyup.intro', null);
66894
66895                   reveal(first.select('.preset-list-button').node(),
66896                       t('intro.points.choose_cafe', { preset: cafePreset.name() }),
66897                       { duration: 300 }
66898                   );
66899
66900                   context.history().on('change.intro', function() {
66901                       continueTo(aboutFeatureEditor);
66902                   });
66903               }
66904           }
66905
66906           function continueTo(nextStep) {
66907               context.on('enter.intro', null);
66908               context.history().on('change.intro', null);
66909               select('.inspector-wrap').on('wheel.intro', null);
66910               select('.preset-search-input').on('keydown.intro keyup.intro', null);
66911               nextStep();
66912           }
66913       }
66914
66915
66916       function aboutFeatureEditor() {
66917           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
66918               return addPoint();
66919           }
66920
66921           timeout(function() {
66922               reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
66923                   tooltipClass: 'intro-points-describe',
66924                   buttonText: t('intro.ok'),
66925                   buttonCallback: function() { continueTo(addName); }
66926               });
66927           }, 400);
66928
66929           context.on('exit.intro', function() {
66930               // if user leaves select mode here, just continue with the tutorial.
66931               continueTo(reselectPoint);
66932           });
66933
66934           function continueTo(nextStep) {
66935               context.on('exit.intro', null);
66936               nextStep();
66937           }
66938       }
66939
66940
66941       function addName() {
66942           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
66943               return addPoint();
66944           }
66945
66946           // reset pane, in case user happened to change it..
66947           select('.inspector-wrap .panewrap').style('right', '0%');
66948
66949           timeout(function() {
66950               // It's possible for the user to add a name in a previous step..
66951               // If so, don't tell them to add the name in this step.
66952               // Give them an OK button instead.
66953               var entity = context.entity(_pointID);
66954               if (entity.tags.name) {
66955                   var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
66956                       tooltipClass: 'intro-points-describe',
66957                       buttonText: t('intro.ok'),
66958                       buttonCallback: function() { continueTo(addCloseEditor); }
66959                   });
66960                   tooltip.select('.instruction').style('display', 'none');
66961
66962               } else {
66963                   reveal('.entity-editor-pane', t('intro.points.add_name'),
66964                       { tooltipClass: 'intro-points-describe' }
66965                   );
66966               }
66967           }, 400);
66968
66969           context.history().on('change.intro', function() {
66970               continueTo(addCloseEditor);
66971           });
66972
66973           context.on('exit.intro', function() {
66974               // if user leaves select mode here, just continue with the tutorial.
66975               continueTo(reselectPoint);
66976           });
66977
66978           function continueTo(nextStep) {
66979               context.on('exit.intro', null);
66980               context.history().on('change.intro', null);
66981               nextStep();
66982           }
66983       }
66984
66985
66986       function addCloseEditor() {
66987           // reset pane, in case user happened to change it..
66988           select('.inspector-wrap .panewrap').style('right', '0%');
66989
66990           var selector = '.entity-editor-pane button.preset-close svg use';
66991           var href = select(selector).attr('href') || '#iD-icon-close';
66992
66993           context.on('exit.intro', function() {
66994               continueTo(reselectPoint);
66995           });
66996
66997           reveal('.entity-editor-pane',
66998               t('intro.points.add_close', { button: icon(href, 'pre-text') })
66999           );
67000
67001           function continueTo(nextStep) {
67002               context.on('exit.intro', null);
67003               nextStep();
67004           }
67005       }
67006
67007
67008       function reselectPoint() {
67009           if (!_pointID) return chapter.restart();
67010           var entity = context.hasEntity(_pointID);
67011           if (!entity) return chapter.restart();
67012
67013           // make sure it's still a cafe, in case user somehow changed it..
67014           var oldPreset = context.presets().match(entity, context.graph());
67015           context.replace(actionChangePreset(_pointID, oldPreset, cafePreset));
67016
67017           context.enter(modeBrowse(context));
67018
67019           var msec = transitionTime(entity.loc, context.map().center());
67020           if (msec) { reveal(null, null, { duration: 0 }); }
67021           context.map().centerEase(entity.loc, msec);
67022
67023           timeout(function() {
67024               var box = pointBox(entity.loc, context);
67025               reveal(box, t('intro.points.reselect'), { duration: 600 });
67026
67027               timeout(function() {
67028                   context.map().on('move.intro drawn.intro', function() {
67029                       var entity = context.hasEntity(_pointID);
67030                       if (!entity) return chapter.restart();
67031                       var box = pointBox(entity.loc, context);
67032                       reveal(box, t('intro.points.reselect'), { duration: 0 });
67033                   });
67034               }, 600); // after reveal..
67035
67036               context.on('enter.intro', function(mode) {
67037                   if (mode.id !== 'select') return;
67038                   continueTo(updatePoint);
67039               });
67040
67041           }, msec + 100);
67042
67043           function continueTo(nextStep) {
67044               context.map().on('move.intro drawn.intro', null);
67045               context.on('enter.intro', null);
67046               nextStep();
67047           }
67048       }
67049
67050
67051       function updatePoint() {
67052           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
67053               return continueTo(reselectPoint);
67054           }
67055
67056           // reset pane, in case user happened to untag the point..
67057           select('.inspector-wrap .panewrap').style('right', '0%');
67058
67059           context.on('exit.intro', function() {
67060               continueTo(reselectPoint);
67061           });
67062
67063           context.history().on('change.intro', function() {
67064               continueTo(updateCloseEditor);
67065           });
67066
67067           timeout(function() {
67068               reveal('.entity-editor-pane', t('intro.points.update'),
67069                   { tooltipClass: 'intro-points-describe' }
67070               );
67071           }, 400);
67072
67073           function continueTo(nextStep) {
67074               context.on('exit.intro', null);
67075               context.history().on('change.intro', null);
67076               nextStep();
67077           }
67078       }
67079
67080
67081       function updateCloseEditor() {
67082           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
67083               return continueTo(reselectPoint);
67084           }
67085
67086           // reset pane, in case user happened to change it..
67087           select('.inspector-wrap .panewrap').style('right', '0%');
67088
67089           context.on('exit.intro', function() {
67090               continueTo(rightClickPoint);
67091           });
67092
67093           timeout(function() {
67094               reveal('.entity-editor-pane',
67095                   t('intro.points.update_close', { button: icon('#iD-icon-apply', 'pre-text') })
67096               );
67097           }, 500);
67098
67099           function continueTo(nextStep) {
67100               context.on('exit.intro', null);
67101               nextStep();
67102           }
67103       }
67104
67105
67106       function rightClickPoint() {
67107           if (!_pointID) return chapter.restart();
67108           var entity = context.hasEntity(_pointID);
67109           if (!entity) return chapter.restart();
67110
67111           context.enter(modeBrowse(context));
67112
67113           var box = pointBox(entity.loc, context);
67114           reveal(box, t('intro.points.rightclick'), { duration: 600 });
67115
67116           timeout(function() {
67117               context.map().on('move.intro drawn.intro', function() {
67118                   var entity = context.hasEntity(_pointID);
67119                   if (!entity) return chapter.restart();
67120                   var box = pointBox(entity.loc, context);
67121                   reveal(box, t('intro.points.rightclick'), { duration: 0 });
67122               });
67123           }, 600); // after reveal
67124
67125           context.on('enter.intro', function(mode) {
67126               if (mode.id !== 'select') return;
67127               var ids = context.selectedIDs();
67128               if (ids.length !== 1 || ids[0] !== _pointID) return;
67129
67130               timeout(function() {
67131                   var node = selectMenuItem('delete').node();
67132                   if (!node) return;
67133                   continueTo(enterDelete);
67134               }, 300);  // after menu visible
67135           });
67136
67137           function continueTo(nextStep) {
67138               context.on('enter.intro', null);
67139               context.map().on('move.intro drawn.intro', null);
67140               nextStep();
67141           }
67142       }
67143
67144
67145       function enterDelete() {
67146           if (!_pointID) return chapter.restart();
67147           var entity = context.hasEntity(_pointID);
67148           if (!entity) return chapter.restart();
67149
67150           var node = selectMenuItem('delete').node();
67151           if (!node) { return continueTo(rightClickPoint); }
67152
67153           revealEditMenu(entity.loc,
67154               t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') })
67155           );
67156
67157           timeout(function() {
67158               context.map().on('move.intro drawn.intro', function() {
67159                   revealEditMenu(entity.loc,
67160                       t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') }),
67161                       { duration: 0}
67162                   );
67163               });
67164           }, 300); // after menu visible
67165
67166           context.on('exit.intro', function() {
67167               if (!_pointID) return chapter.restart();
67168               var entity = context.hasEntity(_pointID);
67169               if (entity) return continueTo(rightClickPoint);  // point still exists
67170           });
67171
67172           context.history().on('change.intro', function(changed) {
67173               if (changed.deleted().length) {
67174                   continueTo(undo);
67175               }
67176           });
67177
67178           function continueTo(nextStep) {
67179               context.map().on('move.intro drawn.intro', null);
67180               context.history().on('change.intro', null);
67181               context.on('exit.intro', null);
67182               nextStep();
67183           }
67184       }
67185
67186
67187       function undo() {
67188           context.history().on('change.intro', function() {
67189               continueTo(play);
67190           });
67191
67192           var iconName = '#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
67193           reveal('#bar button.undo-button',
67194               t('intro.points.undo', { button: icon(iconName, 'pre-text') })
67195           );
67196
67197           function continueTo(nextStep) {
67198               context.history().on('change.intro', null);
67199               nextStep();
67200           }
67201       }
67202
67203
67204       function play() {
67205           dispatch$1.call('done');
67206           reveal('#id-container',
67207               t('intro.points.play', { next: t('intro.areas.title') }), {
67208                   tooltipBox: '.intro-nav-wrap .chapter-area',
67209                   buttonText: t('intro.ok'),
67210                   buttonCallback: function() { reveal('#id-container'); }
67211               }
67212           );
67213       }
67214
67215
67216       chapter.enter = function() {
67217           addPoint();
67218       };
67219
67220
67221       chapter.exit = function() {
67222           timeouts.forEach(window.clearTimeout);
67223           context.on('enter.intro exit.intro', null);
67224           context.map().on('move.intro drawn.intro', null);
67225           context.history().on('change.intro', null);
67226           select('.inspector-wrap').on('wheel.intro', eventCancel);
67227           select('.preset-search-input').on('keydown.intro keyup.intro', null);
67228       };
67229
67230
67231       chapter.restart = function() {
67232           chapter.exit();
67233           chapter.enter();
67234       };
67235
67236
67237       return utilRebind(chapter, dispatch$1, 'on');
67238   }
67239
67240   function uiIntroArea(context, reveal) {
67241       var dispatch$1 = dispatch('done');
67242       var playground = [-85.63552, 41.94159];
67243       var playgroundPreset = context.presets().item('leisure/playground');
67244       var descriptionField = context.presets().field('description');
67245       var timeouts = [];
67246       var _areaID;
67247
67248
67249       var chapter = {
67250           title: 'intro.areas.title'
67251       };
67252
67253
67254       function timeout(f, t) {
67255           timeouts.push(window.setTimeout(f, t));
67256       }
67257
67258
67259       function eventCancel() {
67260           event.stopPropagation();
67261           event.preventDefault();
67262       }
67263
67264
67265       function revealPlayground(center, text, options) {
67266           var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
67267           var box = pad$1(center, padding, context);
67268           reveal(box, text, options);
67269       }
67270
67271
67272       function addArea() {
67273           context.enter(modeBrowse(context));
67274           context.history().reset('initial');
67275           _areaID = null;
67276
67277           var msec = transitionTime(playground, context.map().center());
67278           if (msec) { reveal(null, null, { duration: 0 }); }
67279           context.map().centerZoomEase(playground, 19, msec);
67280
67281           timeout(function() {
67282               var tooltip = reveal('button.add-area',
67283                   t('intro.areas.add_playground', { button: icon('#iD-icon-area', 'pre-text') }));
67284
67285               tooltip.selectAll('.tooltip-inner')
67286                   .insert('svg', 'span')
67287                   .attr('class', 'tooltip-illustration')
67288                   .append('use')
67289                   .attr('xlink:href', '#iD-graphic-areas');
67290
67291               context.on('enter.intro', function(mode) {
67292                   if (mode.id !== 'add-area') return;
67293                   continueTo(startPlayground);
67294               });
67295           }, msec + 100);
67296
67297           function continueTo(nextStep) {
67298               context.on('enter.intro', null);
67299               nextStep();
67300           }
67301       }
67302
67303
67304       function startPlayground() {
67305           if (context.mode().id !== 'add-area') {
67306               return chapter.restart();
67307           }
67308
67309           _areaID = null;
67310           context.map().zoomEase(19.5, 500);
67311
67312           timeout(function() {
67313               revealPlayground(playground,
67314                   t('intro.areas.start_playground'), { duration: 250 }
67315               );
67316
67317               timeout(function() {
67318                   context.map().on('move.intro drawn.intro', function() {
67319                       revealPlayground(playground,
67320                           t('intro.areas.start_playground'), { duration: 0 }
67321                       );
67322                   });
67323                   context.on('enter.intro', function(mode) {
67324                       if (mode.id !== 'draw-area') return chapter.restart();
67325                       continueTo(continuePlayground);
67326                   });
67327               }, 250);  // after reveal
67328
67329           }, 550);  // after easing
67330
67331           function continueTo(nextStep) {
67332               context.map().on('move.intro drawn.intro', null);
67333               context.on('enter.intro', null);
67334               nextStep();
67335           }
67336       }
67337
67338
67339       function continuePlayground() {
67340           if (context.mode().id !== 'draw-area') {
67341               return chapter.restart();
67342           }
67343
67344           _areaID = null;
67345           revealPlayground(playground,
67346               t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
67347               { duration: 250 }
67348           );
67349
67350           timeout(function() {
67351               context.map().on('move.intro drawn.intro', function() {
67352                   revealPlayground(playground,
67353                       t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
67354                       { duration: 0 }
67355                   );
67356               });
67357           }, 250);  // after reveal
67358
67359           context.on('enter.intro', function(mode) {
67360               if (mode.id === 'draw-area') {
67361                   var entity = context.hasEntity(context.selectedIDs()[0]);
67362                   if (entity && entity.nodes.length >= 6) {
67363                       return continueTo(finishPlayground);
67364                   } else {
67365                       return;
67366                   }
67367               } else if (mode.id === 'select') {
67368                   _areaID = context.selectedIDs()[0];
67369                   return continueTo(searchPresets);
67370               } else {
67371                   return chapter.restart();
67372               }
67373           });
67374
67375           function continueTo(nextStep) {
67376               context.map().on('move.intro drawn.intro', null);
67377               context.on('enter.intro', null);
67378               nextStep();
67379           }
67380       }
67381
67382
67383       function finishPlayground() {
67384           if (context.mode().id !== 'draw-area') {
67385               return chapter.restart();
67386           }
67387
67388           _areaID = null;
67389           revealPlayground(playground,
67390               t('intro.areas.finish_playground'), { duration: 250 }
67391           );
67392
67393           timeout(function() {
67394               context.map().on('move.intro drawn.intro', function() {
67395                   revealPlayground(playground,
67396                       t('intro.areas.finish_playground'), { duration: 0 }
67397                   );
67398               });
67399           }, 250);  // after reveal
67400
67401           context.on('enter.intro', function(mode) {
67402               if (mode.id === 'draw-area') {
67403                   return;
67404               } else if (mode.id === 'select') {
67405                   _areaID = context.selectedIDs()[0];
67406                   return continueTo(searchPresets);
67407               } else {
67408                   return chapter.restart();
67409               }
67410           });
67411
67412           function continueTo(nextStep) {
67413               context.map().on('move.intro drawn.intro', null);
67414               context.on('enter.intro', null);
67415               nextStep();
67416           }
67417       }
67418
67419
67420       function searchPresets() {
67421           if (!_areaID || !context.hasEntity(_areaID)) {
67422               return addArea();
67423           }
67424           var ids = context.selectedIDs();
67425           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
67426               context.enter(modeSelect(context, [_areaID]));
67427           }
67428
67429           // disallow scrolling
67430           select('.inspector-wrap').on('wheel.intro', eventCancel);
67431
67432           timeout(function() {
67433               // reset pane, in case user somehow happened to change it..
67434               select('.inspector-wrap .panewrap').style('right', '-100%');
67435
67436               select('.preset-search-input')
67437                   .on('keydown.intro', null)
67438                   .on('keyup.intro', checkPresetSearch);
67439
67440               reveal('.preset-search-input',
67441                   t('intro.areas.search_playground', { preset: playgroundPreset.name() })
67442               );
67443           }, 400);  // after preset list pane visible..
67444
67445           context.on('enter.intro', function(mode) {
67446               if (!_areaID || !context.hasEntity(_areaID)) {
67447                   return continueTo(addArea);
67448               }
67449
67450               var ids = context.selectedIDs();
67451               if (mode.id !== 'select' || !ids.length || ids[0] !== _areaID) {
67452                   // keep the user's area selected..
67453                   context.enter(modeSelect(context, [_areaID]));
67454
67455                   // reset pane, in case user somehow happened to change it..
67456                   select('.inspector-wrap .panewrap').style('right', '-100%');
67457                   // disallow scrolling
67458                   select('.inspector-wrap').on('wheel.intro', eventCancel);
67459
67460                   select('.preset-search-input')
67461                       .on('keydown.intro', null)
67462                       .on('keyup.intro', checkPresetSearch);
67463
67464                   reveal('.preset-search-input',
67465                       t('intro.areas.search_playground', { preset: playgroundPreset.name() })
67466                   );
67467
67468                   context.history().on('change.intro', null);
67469               }
67470           });
67471
67472           function checkPresetSearch() {
67473               var first = select('.preset-list-item:first-child');
67474
67475               if (first.classed('preset-leisure-playground')) {
67476                   reveal(first.select('.preset-list-button').node(),
67477                       t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
67478                       { duration: 300 }
67479                   );
67480
67481                   select('.preset-search-input')
67482                       .on('keydown.intro', eventCancel, true)
67483                       .on('keyup.intro', null);
67484
67485                   context.history().on('change.intro', function() {
67486                       continueTo(clickAddField);
67487                   });
67488               }
67489           }
67490
67491           function continueTo(nextStep) {
67492               select('.inspector-wrap').on('wheel.intro', null);
67493               context.on('enter.intro', null);
67494               context.history().on('change.intro', null);
67495               select('.preset-search-input').on('keydown.intro keyup.intro', null);
67496               nextStep();
67497           }
67498       }
67499
67500
67501       function clickAddField() {
67502           if (!_areaID || !context.hasEntity(_areaID)) {
67503               return addArea();
67504           }
67505           var ids = context.selectedIDs();
67506           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
67507               return searchPresets();
67508           }
67509
67510           if (!select('.form-field-description').empty()) {
67511               return continueTo(describePlayground);
67512           }
67513
67514           // disallow scrolling
67515           select('.inspector-wrap').on('wheel.intro', eventCancel);
67516
67517           timeout(function() {
67518               // reset pane, in case user somehow happened to change it..
67519               select('.inspector-wrap .panewrap').style('right', '0%');
67520
67521               // It's possible for the user to add a description in a previous step..
67522               // If they did this already, just continue to next step.
67523               var entity = context.entity(_areaID);
67524               if (entity.tags.description) {
67525                   return continueTo(play);
67526               }
67527
67528               // scroll "Add field" into view
67529               var box = select('.more-fields').node().getBoundingClientRect();
67530               if (box.top > 300) {
67531                   var pane = select('.entity-editor-pane .inspector-body');
67532                   var start = pane.node().scrollTop;
67533                   var end = start + (box.top - 300);
67534
67535                   pane
67536                       .transition()
67537                       .duration(250)
67538                       .tween('scroll.inspector', function() {
67539                           var node = this;
67540                           var i = interpolateNumber(start, end);
67541                           return function(t) {
67542                               node.scrollTop = i(t);
67543                           };
67544                       });
67545               }
67546
67547               timeout(function() {
67548                   reveal('.more-fields .combobox-input',
67549                       t('intro.areas.add_field'),
67550                       { duration: 300 }
67551                   );
67552
67553                   select('.more-fields .combobox-input')
67554                       .on('click.intro', function() {
67555                           // Watch for the combobox to appear...
67556                           var watcher;
67557                           watcher = window.setInterval(function() {
67558                               if (!select('div.combobox').empty()) {
67559                                   window.clearInterval(watcher);
67560                                   continueTo(chooseDescriptionField);
67561                               }
67562                           }, 300);
67563                       });
67564               }, 300);  // after "Add Field" visible
67565
67566           }, 400);  // after editor pane visible
67567
67568           context.on('exit.intro', function() {
67569               return continueTo(searchPresets);
67570           });
67571
67572           function continueTo(nextStep) {
67573               select('.inspector-wrap').on('wheel.intro', null);
67574               select('.more-fields .combobox-input').on('click.intro', null);
67575               context.on('exit.intro', null);
67576               nextStep();
67577           }
67578       }
67579
67580
67581       function chooseDescriptionField() {
67582           if (!_areaID || !context.hasEntity(_areaID)) {
67583               return addArea();
67584           }
67585           var ids = context.selectedIDs();
67586           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
67587               return searchPresets();
67588           }
67589
67590           if (!select('.form-field-description').empty()) {
67591               return continueTo(describePlayground);
67592           }
67593
67594           // Make sure combobox is ready..
67595           if (select('div.combobox').empty()) {
67596               return continueTo(clickAddField);
67597           }
67598           // Watch for the combobox to go away..
67599           var watcher;
67600           watcher = window.setInterval(function() {
67601               if (select('div.combobox').empty()) {
67602                   window.clearInterval(watcher);
67603                   timeout(function() {
67604                       if (select('.form-field-description').empty()) {
67605                           continueTo(retryChooseDescription);
67606                       } else {
67607                           continueTo(describePlayground);
67608                       }
67609                   }, 300);  // after description field added.
67610               }
67611           }, 300);
67612
67613           reveal('div.combobox',
67614               t('intro.areas.choose_field', { field: descriptionField.label() }),
67615               { duration: 300 }
67616           );
67617
67618           context.on('exit.intro', function() {
67619               return continueTo(searchPresets);
67620           });
67621
67622           function continueTo(nextStep) {
67623               if (watcher) window.clearInterval(watcher);
67624               context.on('exit.intro', null);
67625               nextStep();
67626           }
67627       }
67628
67629
67630       function describePlayground() {
67631           if (!_areaID || !context.hasEntity(_areaID)) {
67632               return addArea();
67633           }
67634           var ids = context.selectedIDs();
67635           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
67636               return searchPresets();
67637           }
67638
67639           // reset pane, in case user happened to change it..
67640           select('.inspector-wrap .panewrap').style('right', '0%');
67641
67642           if (select('.form-field-description').empty()) {
67643               return continueTo(retryChooseDescription);
67644           }
67645
67646           context.on('exit.intro', function() {
67647               continueTo(play);
67648           });
67649
67650           reveal('.entity-editor-pane',
67651               t('intro.areas.describe_playground', { button: icon('#iD-icon-apply', 'pre-text') }),
67652               { duration: 300 }
67653           );
67654
67655           function continueTo(nextStep) {
67656               context.on('exit.intro', null);
67657               nextStep();
67658           }
67659       }
67660
67661
67662       function retryChooseDescription() {
67663           if (!_areaID || !context.hasEntity(_areaID)) {
67664               return addArea();
67665           }
67666           var ids = context.selectedIDs();
67667           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
67668               return searchPresets();
67669           }
67670
67671           // reset pane, in case user happened to change it..
67672           select('.inspector-wrap .panewrap').style('right', '0%');
67673
67674           reveal('.entity-editor-pane',
67675               t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
67676               buttonText: t('intro.ok'),
67677               buttonCallback: function() { continueTo(clickAddField); }
67678           });
67679
67680           context.on('exit.intro', function() {
67681               return continueTo(searchPresets);
67682           });
67683
67684           function continueTo(nextStep) {
67685               context.on('exit.intro', null);
67686               nextStep();
67687           }
67688       }
67689
67690
67691       function play() {
67692           dispatch$1.call('done');
67693           reveal('#id-container',
67694               t('intro.areas.play', { next: t('intro.lines.title') }), {
67695                   tooltipBox: '.intro-nav-wrap .chapter-line',
67696                   buttonText: t('intro.ok'),
67697                   buttonCallback: function() { reveal('#id-container'); }
67698               }
67699           );
67700       }
67701
67702
67703       chapter.enter = function() {
67704           addArea();
67705       };
67706
67707
67708       chapter.exit = function() {
67709           timeouts.forEach(window.clearTimeout);
67710           context.on('enter.intro exit.intro', null);
67711           context.map().on('move.intro drawn.intro', null);
67712           context.history().on('change.intro', null);
67713           select('.inspector-wrap').on('wheel.intro', null);
67714           select('.preset-search-input').on('keydown.intro keyup.intro', null);
67715           select('.more-fields .combobox-input').on('click.intro', null);
67716       };
67717
67718
67719       chapter.restart = function() {
67720           chapter.exit();
67721           chapter.enter();
67722       };
67723
67724
67725       return utilRebind(chapter, dispatch$1, 'on');
67726   }
67727
67728   function uiIntroLine(context, reveal) {
67729       var dispatch$1 = dispatch('done');
67730       var timeouts = [];
67731       var _tulipRoadID = null;
67732       var flowerRoadID = 'w646';
67733       var tulipRoadStart = [-85.6297754121684, 41.95805253325314];
67734       var tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204];
67735       var tulipRoadIntersection = [-85.62974496187628, 41.95742515554585];
67736       var roadCategory = context.presets().item('category-road');
67737       var residentialPreset = context.presets().item('highway/residential');
67738       var woodRoadID = 'w525';
67739       var woodRoadEndID = 'n2862';
67740       var woodRoadAddNode = [-85.62390110349587, 41.95397111462291];
67741       var woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487];
67742       var woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872];
67743       var washingtonStreetID = 'w522';
67744       var twelfthAvenueID = 'w1';
67745       var eleventhAvenueEndID = 'n3550';
67746       var twelfthAvenueEndID = 'n5';
67747       var _washingtonSegmentID = null;
67748       var eleventhAvenueEnd = context.entity(eleventhAvenueEndID).loc;
67749       var twelfthAvenueEnd = context.entity(twelfthAvenueEndID).loc;
67750       var deleteLinesLoc = [-85.6219395542764, 41.95228033922477];
67751       var twelfthAvenue = [-85.62219310052491, 41.952505413152956];
67752
67753
67754       var chapter = {
67755           title: 'intro.lines.title'
67756       };
67757
67758
67759       function timeout(f, t) {
67760           timeouts.push(window.setTimeout(f, t));
67761       }
67762
67763
67764       function eventCancel() {
67765           event.stopPropagation();
67766           event.preventDefault();
67767       }
67768
67769
67770       function revealEditMenu(loc, text, options) {
67771           var rect = context.surfaceRect();
67772           var point = context.curtainProjection(loc);
67773           var pad = 40;
67774           var width = 250 + (2 * pad);
67775           var height = 350;
67776           var startX = rect.left + point[0];
67777           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
67778           var box = {
67779               left: left,
67780               top: point[1] + rect.top - 60,
67781               width: width,
67782               height: height
67783           };
67784           reveal(box, text, options);
67785       }
67786
67787
67788       function addLine() {
67789           context.enter(modeBrowse(context));
67790           context.history().reset('initial');
67791
67792           var msec = transitionTime(tulipRoadStart, context.map().center());
67793           if (msec) { reveal(null, null, { duration: 0 }); }
67794           context.map().centerZoomEase(tulipRoadStart, 18.5, msec);
67795
67796           timeout(function() {
67797               var tooltip = reveal('button.add-line',
67798                   t('intro.lines.add_line', { button: icon('#iD-icon-line', 'pre-text') }));
67799
67800               tooltip.selectAll('.tooltip-inner')
67801                   .insert('svg', 'span')
67802                   .attr('class', 'tooltip-illustration')
67803                   .append('use')
67804                   .attr('xlink:href', '#iD-graphic-lines');
67805
67806               context.on('enter.intro', function(mode) {
67807                   if (mode.id !== 'add-line') return;
67808                   continueTo(startLine);
67809               });
67810           }, msec + 100);
67811
67812           function continueTo(nextStep) {
67813               context.on('enter.intro', null);
67814               nextStep();
67815           }
67816       }
67817
67818
67819       function startLine() {
67820           if (context.mode().id !== 'add-line') return chapter.restart();
67821
67822           _tulipRoadID = null;
67823
67824           var padding = 70 * Math.pow(2, context.map().zoom() - 18);
67825           var box = pad$1(tulipRoadStart, padding, context);
67826           box.height = box.height + 100;
67827           reveal(box, t('intro.lines.start_line'));
67828
67829           context.map().on('move.intro drawn.intro', function() {
67830               padding = 70 * Math.pow(2, context.map().zoom() - 18);
67831               box = pad$1(tulipRoadStart, padding, context);
67832               box.height = box.height + 100;
67833               reveal(box, t('intro.lines.start_line'), { duration: 0 });
67834           });
67835
67836           context.on('enter.intro', function(mode) {
67837               if (mode.id !== 'draw-line') return chapter.restart();
67838               continueTo(drawLine);
67839           });
67840
67841           function continueTo(nextStep) {
67842               context.map().on('move.intro drawn.intro', null);
67843               context.on('enter.intro', null);
67844               nextStep();
67845           }
67846       }
67847
67848
67849       function drawLine() {
67850           if (context.mode().id !== 'draw-line') return chapter.restart();
67851
67852           _tulipRoadID = context.mode().selectedIDs()[0];
67853           context.map().centerEase(tulipRoadMidpoint, 500);
67854
67855           timeout(function() {
67856               var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
67857               var box = pad$1(tulipRoadMidpoint, padding, context);
67858               box.height = box.height * 2;
67859               reveal(box,
67860                   t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
67861               );
67862
67863               context.map().on('move.intro drawn.intro', function() {
67864                   padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
67865                   box = pad$1(tulipRoadMidpoint, padding, context);
67866                   box.height = box.height * 2;
67867                   reveal(box,
67868                       t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
67869                       { duration: 0 }
67870                   );
67871               });
67872           }, 550);  // after easing..
67873
67874           context.history().on('change.intro', function() {
67875               if (isLineConnected()) {
67876                   continueTo(continueLine);
67877               }
67878           });
67879
67880           context.on('enter.intro', function(mode) {
67881               if (mode.id === 'draw-line') {
67882                   return;
67883               } else if (mode.id === 'select') {
67884                   continueTo(retryIntersect);
67885                   return;
67886               } else {
67887                   return chapter.restart();
67888               }
67889           });
67890
67891           function continueTo(nextStep) {
67892               context.map().on('move.intro drawn.intro', null);
67893               context.history().on('change.intro', null);
67894               context.on('enter.intro', null);
67895               nextStep();
67896           }
67897       }
67898
67899
67900       function isLineConnected() {
67901           var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
67902           if (!entity) return false;
67903
67904           var drawNodes = context.graph().childNodes(entity);
67905           return some(drawNodes, function(node) {
67906               return some(context.graph().parentWays(node), function(parent) {
67907                   return parent.id === flowerRoadID;
67908               });
67909           });
67910       }
67911
67912
67913       function retryIntersect() {
67914           select(window).on('mousedown.intro', eventCancel, true);
67915
67916           var box = pad$1(tulipRoadIntersection, 80, context);
67917           reveal(box,
67918               t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
67919           );
67920
67921           timeout(chapter.restart, 3000);
67922       }
67923
67924
67925       function continueLine() {
67926           if (context.mode().id !== 'draw-line') return chapter.restart();
67927           var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
67928           if (!entity) return chapter.restart();
67929
67930           context.map().centerEase(tulipRoadIntersection, 500);
67931
67932           reveal('#surface', t('intro.lines.continue_line'));
67933
67934           context.on('enter.intro', function(mode) {
67935               if (mode.id === 'draw-line')
67936                   return;
67937               else if (mode.id === 'select')
67938                   return continueTo(chooseCategoryRoad);
67939               else
67940                   return chapter.restart();
67941           });
67942
67943           function continueTo(nextStep) {
67944               context.on('enter.intro', null);
67945               nextStep();
67946           }
67947       }
67948
67949
67950       function chooseCategoryRoad() {
67951           if (context.mode().id !== 'select') return chapter.restart();
67952
67953           context.on('exit.intro', function() {
67954               return chapter.restart();
67955           });
67956
67957           var button = select('.preset-category-road .preset-list-button');
67958           if (button.empty()) return chapter.restart();
67959
67960           // disallow scrolling
67961           select('.inspector-wrap').on('wheel.intro', eventCancel);
67962
67963           timeout(function() {
67964               // reset pane, in case user somehow happened to change it..
67965               select('.inspector-wrap .panewrap').style('right', '-100%');
67966
67967               reveal(button.node(),
67968                   t('intro.lines.choose_category_road', { category: roadCategory.name() })
67969               );
67970
67971               button.on('click.intro', function() {
67972                   continueTo(choosePresetResidential);
67973               });
67974
67975           }, 400);  // after editor pane visible
67976
67977           function continueTo(nextStep) {
67978               select('.inspector-wrap').on('wheel.intro', null);
67979               select('.preset-list-button').on('click.intro', null);
67980               context.on('exit.intro', null);
67981               nextStep();
67982           }
67983       }
67984
67985
67986       function choosePresetResidential() {
67987           if (context.mode().id !== 'select') return chapter.restart();
67988
67989           context.on('exit.intro', function() {
67990               return chapter.restart();
67991           });
67992
67993           var subgrid = select('.preset-category-road .subgrid');
67994           if (subgrid.empty()) return chapter.restart();
67995
67996           subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
67997               .on('click.intro', function() {
67998                   continueTo(retryPresetResidential);
67999               });
68000
68001           subgrid.selectAll('.preset-highway-residential .preset-list-button')
68002               .on('click.intro', function() {
68003                   continueTo(nameRoad);
68004               });
68005
68006           timeout(function() {
68007               reveal(subgrid.node(),
68008                   t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
68009                   { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
68010               );
68011           }, 300);
68012
68013           function continueTo(nextStep) {
68014               select('.preset-list-button').on('click.intro', null);
68015               context.on('exit.intro', null);
68016               nextStep();
68017           }
68018       }
68019
68020
68021       // selected wrong road type
68022       function retryPresetResidential() {
68023           if (context.mode().id !== 'select') return chapter.restart();
68024
68025           context.on('exit.intro', function() {
68026               return chapter.restart();
68027           });
68028
68029           // disallow scrolling
68030           select('.inspector-wrap').on('wheel.intro', eventCancel);
68031
68032           timeout(function() {
68033               var button = select('.entity-editor-pane .preset-list-button');
68034
68035               reveal(button.node(),
68036                   t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
68037               );
68038
68039               button.on('click.intro', function() {
68040                   continueTo(chooseCategoryRoad);
68041               });
68042
68043           }, 500);
68044
68045           function continueTo(nextStep) {
68046               select('.inspector-wrap').on('wheel.intro', null);
68047               select('.preset-list-button').on('click.intro', null);
68048               context.on('exit.intro', null);
68049               nextStep();
68050           }
68051       }
68052
68053
68054       function nameRoad() {
68055           context.on('exit.intro', function() {
68056               continueTo(didNameRoad);
68057           });
68058
68059           timeout(function() {
68060               reveal('.entity-editor-pane',
68061                   t('intro.lines.name_road', { button: icon('#iD-icon-apply', 'pre-text') }),
68062                   { tooltipClass: 'intro-lines-name_road' }
68063               );
68064           }, 500);
68065
68066           function continueTo(nextStep) {
68067               context.on('exit.intro', null);
68068               nextStep();
68069           }
68070       }
68071
68072
68073       function didNameRoad() {
68074           context.history().checkpoint('doneAddLine');
68075
68076           timeout(function() {
68077               reveal('#surface', t('intro.lines.did_name_road'), {
68078                   buttonText: t('intro.ok'),
68079                   buttonCallback: function() { continueTo(updateLine); }
68080               });
68081           }, 500);
68082
68083           function continueTo(nextStep) {
68084               nextStep();
68085           }
68086       }
68087
68088
68089       function updateLine() {
68090           context.history().reset('doneAddLine');
68091           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68092               return chapter.restart();
68093           }
68094
68095           var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
68096           if (msec) { reveal(null, null, { duration: 0 }); }
68097           context.map().centerZoomEase(woodRoadDragMidpoint, 19, msec);
68098
68099           timeout(function() {
68100               var padding = 250 * Math.pow(2, context.map().zoom() - 19);
68101               var box = pad$1(woodRoadDragMidpoint, padding, context);
68102               var advance = function() { continueTo(addNode); };
68103
68104               reveal(box, t('intro.lines.update_line'),
68105                   { buttonText: t('intro.ok'), buttonCallback: advance }
68106               );
68107
68108               context.map().on('move.intro drawn.intro', function() {
68109                   var padding = 250 * Math.pow(2, context.map().zoom() - 19);
68110                   var box = pad$1(woodRoadDragMidpoint, padding, context);
68111                   reveal(box, t('intro.lines.update_line'),
68112                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
68113                   );
68114               });
68115           }, msec + 100);
68116
68117           function continueTo(nextStep) {
68118               context.map().on('move.intro drawn.intro', null);
68119               nextStep();
68120           }
68121       }
68122
68123
68124       function addNode() {
68125           context.history().reset('doneAddLine');
68126           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68127               return chapter.restart();
68128           }
68129
68130           var padding = 40 * Math.pow(2, context.map().zoom() - 19);
68131           var box = pad$1(woodRoadAddNode, padding, context);
68132           reveal(box, t('intro.lines.add_node'));
68133
68134           context.map().on('move.intro drawn.intro', function() {
68135               var padding = 40 * Math.pow(2, context.map().zoom() - 19);
68136               var box = pad$1(woodRoadAddNode, padding, context);
68137               reveal(box, t('intro.lines.add_node'), { duration: 0 });
68138           });
68139
68140           context.history().on('change.intro', function(changed) {
68141               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68142                   return continueTo(updateLine);
68143               }
68144               if (changed.created().length === 1) {
68145                   timeout(function() { continueTo(startDragEndpoint); }, 500);
68146               }
68147           });
68148
68149           context.on('enter.intro', function(mode) {
68150               if (mode.id !== 'select') {
68151                   continueTo(updateLine);
68152               }
68153           });
68154
68155           function continueTo(nextStep) {
68156               context.map().on('move.intro drawn.intro', null);
68157               context.history().on('change.intro', null);
68158               context.on('enter.intro', null);
68159               nextStep();
68160           }
68161       }
68162
68163
68164       function startDragEndpoint() {
68165           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68166               return continueTo(updateLine);
68167           }
68168           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
68169           var box = pad$1(woodRoadDragEndpoint, padding, context);
68170           reveal(box, t('intro.lines.start_drag_endpoint'));
68171
68172           context.map().on('move.intro drawn.intro', function() {
68173               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68174                   return continueTo(updateLine);
68175               }
68176               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
68177               var box = pad$1(woodRoadDragEndpoint, padding, context);
68178               reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
68179
68180               var entity = context.entity(woodRoadEndID);
68181               if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
68182                   continueTo(finishDragEndpoint);
68183               }
68184           });
68185
68186           function continueTo(nextStep) {
68187               context.map().on('move.intro drawn.intro', null);
68188               nextStep();
68189           }
68190       }
68191
68192
68193       function finishDragEndpoint() {
68194           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68195               return continueTo(updateLine);
68196           }
68197
68198           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
68199           var box = pad$1(woodRoadDragEndpoint, padding, context);
68200           reveal(box, t('intro.lines.finish_drag_endpoint'));
68201
68202           context.map().on('move.intro drawn.intro', function() {
68203               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68204                   return continueTo(updateLine);
68205               }
68206               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
68207               var box = pad$1(woodRoadDragEndpoint, padding, context);
68208               reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
68209
68210               var entity = context.entity(woodRoadEndID);
68211               if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
68212                   continueTo(startDragEndpoint);
68213               }
68214           });
68215
68216           context.on('enter.intro', function() {
68217               continueTo(startDragMidpoint);
68218           });
68219
68220           function continueTo(nextStep) {
68221               context.map().on('move.intro drawn.intro', null);
68222               context.on('enter.intro', null);
68223               nextStep();
68224           }
68225       }
68226
68227
68228       function startDragMidpoint() {
68229           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68230               return continueTo(updateLine);
68231           }
68232           if (context.selectedIDs().indexOf(woodRoadID) === -1) {
68233               context.enter(modeSelect(context, [woodRoadID]));
68234           }
68235
68236           var padding = 80 * Math.pow(2, context.map().zoom() - 19);
68237           var box = pad$1(woodRoadDragMidpoint, padding, context);
68238           reveal(box, t('intro.lines.start_drag_midpoint'));
68239
68240           context.map().on('move.intro drawn.intro', function() {
68241               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68242                   return continueTo(updateLine);
68243               }
68244               var padding = 80 * Math.pow(2, context.map().zoom() - 19);
68245               var box = pad$1(woodRoadDragMidpoint, padding, context);
68246               reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
68247           });
68248
68249           context.history().on('change.intro', function(changed) {
68250               if (changed.created().length === 1) {
68251                   continueTo(continueDragMidpoint);
68252               }
68253           });
68254
68255           context.on('enter.intro', function(mode) {
68256               if (mode.id !== 'select') {
68257                   // keep Wood Road selected so midpoint triangles are drawn..
68258                   context.enter(modeSelect(context, [woodRoadID]));
68259               }
68260           });
68261
68262           function continueTo(nextStep) {
68263               context.map().on('move.intro drawn.intro', null);
68264               context.history().on('change.intro', null);
68265               context.on('enter.intro', null);
68266               nextStep();
68267           }
68268       }
68269
68270
68271       function continueDragMidpoint() {
68272           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68273               return continueTo(updateLine);
68274           }
68275
68276           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
68277           var box = pad$1(woodRoadDragEndpoint, padding, context);
68278           box.height += 400;
68279
68280           var advance = function() {
68281               context.history().checkpoint('doneUpdateLine');
68282               continueTo(deleteLines);
68283           };
68284
68285           reveal(box, t('intro.lines.continue_drag_midpoint'),
68286               { buttonText: t('intro.ok'), buttonCallback: advance }
68287           );
68288
68289           context.map().on('move.intro drawn.intro', function() {
68290               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68291                   return continueTo(updateLine);
68292               }
68293               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
68294               var box = pad$1(woodRoadDragEndpoint, padding, context);
68295               box.height += 400;
68296               reveal(box, t('intro.lines.continue_drag_midpoint'),
68297                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
68298               );
68299           });
68300
68301           function continueTo(nextStep) {
68302               context.map().on('move.intro drawn.intro', null);
68303               nextStep();
68304           }
68305       }
68306
68307
68308       function deleteLines() {
68309           context.history().reset('doneUpdateLine');
68310           context.enter(modeBrowse(context));
68311
68312           if (!context.hasEntity(washingtonStreetID) ||
68313               !context.hasEntity(twelfthAvenueID) ||
68314               !context.hasEntity(eleventhAvenueEndID)) {
68315               return chapter.restart();
68316           }
68317
68318           var msec = transitionTime(deleteLinesLoc, context.map().center());
68319           if (msec) { reveal(null, null, { duration: 0 }); }
68320           context.map().centerZoomEase(deleteLinesLoc, 18, msec);
68321
68322           timeout(function() {
68323               var padding = 200 * Math.pow(2, context.map().zoom() - 18);
68324               var box = pad$1(deleteLinesLoc, padding, context);
68325               box.top -= 200;
68326               box.height += 400;
68327               var advance = function() { continueTo(rightClickIntersection); };
68328
68329               reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
68330                   { buttonText: t('intro.ok'), buttonCallback: advance }
68331               );
68332
68333               context.map().on('move.intro drawn.intro', function() {
68334                   var padding = 200 * Math.pow(2, context.map().zoom() - 18);
68335                   var box = pad$1(deleteLinesLoc, padding, context);
68336                   box.top -= 200;
68337                   box.height += 400;
68338                   reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
68339                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
68340                   );
68341               });
68342
68343               context.history().on('change.intro', function() {
68344                   timeout(function() {
68345                       continueTo(deleteLines);
68346                   }, 500);  // after any transition (e.g. if user deleted intersection)
68347               });
68348
68349           }, msec + 100);
68350
68351           function continueTo(nextStep) {
68352               context.map().on('move.intro drawn.intro', null);
68353               context.history().on('change.intro', null);
68354               nextStep();
68355           }
68356       }
68357
68358
68359       function rightClickIntersection() {
68360           context.history().reset('doneUpdateLine');
68361           context.enter(modeBrowse(context));
68362
68363           context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
68364
68365           timeout(function() {
68366               var padding = 60 * Math.pow(2, context.map().zoom() - 18);
68367               var box = pad$1(eleventhAvenueEnd, padding, context);
68368               reveal(box, t('intro.lines.rightclick_intersection',
68369                   { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
68370               );
68371
68372               context.map().on('move.intro drawn.intro', function() {
68373                   var padding = 60 * Math.pow(2, context.map().zoom() - 18);
68374                   var box = pad$1(eleventhAvenueEnd, padding, context);
68375                   reveal(box, t('intro.lines.rightclick_intersection',
68376                       { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
68377                       { duration: 0 }
68378                   );
68379               });
68380
68381               context.on('enter.intro', function(mode) {
68382                   if (mode.id !== 'select') return;
68383                   var ids = context.selectedIDs();
68384                   if (ids.length !== 1 || ids[0] !== eleventhAvenueEndID) return;
68385
68386                   timeout(function() {
68387                       var node = selectMenuItem('split').node();
68388                       if (!node) return;
68389                       continueTo(splitIntersection);
68390                   }, 300);  // after menu visible
68391               });
68392
68393               context.history().on('change.intro', function() {
68394                   timeout(function() {
68395                       continueTo(deleteLines);
68396                   }, 300);  // after any transition (e.g. if user deleted intersection)
68397               });
68398
68399           }, 600);
68400
68401           function continueTo(nextStep) {
68402               context.map().on('move.intro drawn.intro', null);
68403               context.on('enter.intro', null);
68404               context.history().on('change.intro', null);
68405               nextStep();
68406           }
68407       }
68408
68409
68410       function splitIntersection() {
68411           if (!context.hasEntity(washingtonStreetID) ||
68412               !context.hasEntity(twelfthAvenueID) ||
68413               !context.hasEntity(eleventhAvenueEndID)) {
68414               return continueTo(deleteLines);
68415           }
68416
68417           var node = selectMenuItem('split').node();
68418           if (!node) { return continueTo(rightClickIntersection); }
68419
68420           var wasChanged = false;
68421           var menuCoords = context.map().mouseCoordinates();
68422           _washingtonSegmentID = null;
68423
68424           revealEditMenu(menuCoords, t('intro.lines.split_intersection',
68425               { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
68426           );
68427
68428           context.map().on('move.intro drawn.intro', function() {
68429               var node = selectMenuItem('split').node();
68430               if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
68431
68432               revealEditMenu(menuCoords, t('intro.lines.split_intersection',
68433                   { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
68434                   { duration: 0 }
68435               );
68436           });
68437
68438           context.history().on('change.intro', function(changed) {
68439               wasChanged = true;
68440               timeout(function() {
68441                   if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
68442                       _washingtonSegmentID = changed.created()[0].id;
68443                       continueTo(didSplit);
68444                   } else {
68445                       _washingtonSegmentID = null;
68446                       continueTo(retrySplit);
68447                   }
68448               }, 300);  // after any transition (e.g. if user deleted intersection)
68449           });
68450
68451           function continueTo(nextStep) {
68452               context.map().on('move.intro drawn.intro', null);
68453               context.history().on('change.intro', null);
68454               nextStep();
68455           }
68456       }
68457
68458
68459       function retrySplit() {
68460           context.enter(modeBrowse(context));
68461           context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
68462           var advance = function() { continueTo(rightClickIntersection); };
68463
68464           var padding = 60 * Math.pow(2, context.map().zoom() - 18);
68465           var box = pad$1(eleventhAvenueEnd, padding, context);
68466           reveal(box, t('intro.lines.retry_split'),
68467               { buttonText: t('intro.ok'), buttonCallback: advance }
68468           );
68469
68470           context.map().on('move.intro drawn.intro', function() {
68471               var padding = 60 * Math.pow(2, context.map().zoom() - 18);
68472               var box = pad$1(eleventhAvenueEnd, padding, context);
68473               reveal(box, t('intro.lines.retry_split'),
68474                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
68475               );
68476           });
68477
68478           function continueTo(nextStep) {
68479               context.map().on('move.intro drawn.intro', null);
68480               nextStep();
68481           }
68482       }
68483
68484
68485       function didSplit() {
68486           if (!_washingtonSegmentID ||
68487               !context.hasEntity(_washingtonSegmentID) ||
68488               !context.hasEntity(washingtonStreetID) ||
68489               !context.hasEntity(twelfthAvenueID) ||
68490               !context.hasEntity(eleventhAvenueEndID)) {
68491               return continueTo(rightClickIntersection);
68492           }
68493
68494           var ids = context.selectedIDs();
68495           var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
68496           var street = t('intro.graph.name.washington-street');
68497
68498           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
68499           var box = pad$1(twelfthAvenue, padding, context);
68500           box.width = box.width / 2;
68501           reveal(box, t(string, { street1: street, street2: street }),
68502               { duration: 500 }
68503           );
68504
68505           timeout(function() {
68506               context.map().centerZoomEase(twelfthAvenue, 18, 500);
68507
68508               context.map().on('move.intro drawn.intro', function() {
68509                   var padding = 200 * Math.pow(2, context.map().zoom() - 18);
68510                   var box = pad$1(twelfthAvenue, padding, context);
68511                   box.width = box.width / 2;
68512                   reveal(box, t(string, { street1: street, street2: street }),
68513                       { duration: 0 }
68514                   );
68515               });
68516           }, 600);  // after initial reveal and curtain cut
68517
68518           context.on('enter.intro', function() {
68519               var ids = context.selectedIDs();
68520               if (ids.length === 1 && ids[0] === _washingtonSegmentID) {
68521                   continueTo(multiSelect);
68522               }
68523           });
68524
68525           context.history().on('change.intro', function() {
68526               if (!_washingtonSegmentID ||
68527                   !context.hasEntity(_washingtonSegmentID) ||
68528                   !context.hasEntity(washingtonStreetID) ||
68529                   !context.hasEntity(twelfthAvenueID) ||
68530                   !context.hasEntity(eleventhAvenueEndID)) {
68531                   return continueTo(rightClickIntersection);
68532               }
68533           });
68534
68535           function continueTo(nextStep) {
68536               context.map().on('move.intro drawn.intro', null);
68537               context.on('enter.intro', null);
68538               context.history().on('change.intro', null);
68539               nextStep();
68540           }
68541       }
68542
68543
68544       function multiSelect() {
68545           if (!_washingtonSegmentID ||
68546               !context.hasEntity(_washingtonSegmentID) ||
68547               !context.hasEntity(washingtonStreetID) ||
68548               !context.hasEntity(twelfthAvenueID) ||
68549               !context.hasEntity(eleventhAvenueEndID)) {
68550               return continueTo(rightClickIntersection);
68551           }
68552
68553           var ids = context.selectedIDs();
68554           var hasWashington = ids.indexOf(_washingtonSegmentID) !== -1;
68555           var hasTwelfth = ids.indexOf(twelfthAvenueID) !== -1;
68556
68557           if (hasWashington && hasTwelfth) {
68558               return continueTo(multiRightClick);
68559           } else if (!hasWashington && !hasTwelfth) {
68560               return continueTo(didSplit);
68561           }
68562
68563           context.map().centerZoomEase(twelfthAvenue, 18, 500);
68564
68565           timeout(function() {
68566               var selected, other, padding, box;
68567               if (hasWashington) {
68568                   selected = t('intro.graph.name.washington-street');
68569                   other = t('intro.graph.name.12th-avenue');
68570                   padding = 60 * Math.pow(2, context.map().zoom() - 18);
68571                   box = pad$1(twelfthAvenueEnd, padding, context);
68572                   box.width *= 3;
68573               } else {
68574                   selected = t('intro.graph.name.12th-avenue');
68575                   other = t('intro.graph.name.washington-street');
68576                   padding = 200 * Math.pow(2, context.map().zoom() - 18);
68577                   box = pad$1(twelfthAvenue, padding, context);
68578                   box.width /= 2;
68579               }
68580
68581               reveal(box,
68582                   t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
68583               );
68584
68585               context.map().on('move.intro drawn.intro', function() {
68586                   if (hasWashington) {
68587                       selected = t('intro.graph.name.washington-street');
68588                       other = t('intro.graph.name.12th-avenue');
68589                       padding = 60 * Math.pow(2, context.map().zoom() - 18);
68590                       box = pad$1(twelfthAvenueEnd, padding, context);
68591                       box.width *= 3;
68592                   } else {
68593                       selected = t('intro.graph.name.12th-avenue');
68594                       other = t('intro.graph.name.washington-street');
68595                       padding = 200 * Math.pow(2, context.map().zoom() - 18);
68596                       box = pad$1(twelfthAvenue, padding, context);
68597                       box.width /= 2;
68598                   }
68599
68600                   reveal(box,
68601                       t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
68602                       { duration: 0 }
68603                   );
68604               });
68605
68606               context.on('enter.intro', function() {
68607                   continueTo(multiSelect);
68608               });
68609
68610               context.history().on('change.intro', function() {
68611                   if (!_washingtonSegmentID ||
68612                       !context.hasEntity(_washingtonSegmentID) ||
68613                       !context.hasEntity(washingtonStreetID) ||
68614                       !context.hasEntity(twelfthAvenueID) ||
68615                       !context.hasEntity(eleventhAvenueEndID)) {
68616                       return continueTo(rightClickIntersection);
68617                   }
68618               });
68619           }, 600);
68620
68621           function continueTo(nextStep) {
68622               context.map().on('move.intro drawn.intro', null);
68623               context.on('enter.intro', null);
68624               context.history().on('change.intro', null);
68625               nextStep();
68626           }
68627       }
68628
68629
68630       function multiRightClick() {
68631           if (!_washingtonSegmentID ||
68632               !context.hasEntity(_washingtonSegmentID) ||
68633               !context.hasEntity(washingtonStreetID) ||
68634               !context.hasEntity(twelfthAvenueID) ||
68635               !context.hasEntity(eleventhAvenueEndID)) {
68636               return continueTo(rightClickIntersection);
68637           }
68638
68639           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
68640           var box = pad$1(twelfthAvenue, padding, context);
68641           reveal(box, t('intro.lines.multi_rightclick'));
68642
68643           context.map().on('move.intro drawn.intro', function() {
68644               var padding = 200 * Math.pow(2, context.map().zoom() - 18);
68645               var box = pad$1(twelfthAvenue, padding, context);
68646               reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
68647           });
68648
68649           select(window).on('click.intro contextmenu.intro', function() {
68650               timeout(function() {
68651                   var ids = context.selectedIDs();
68652                   if (ids.length === 2 &&
68653                       ids.indexOf(twelfthAvenueID) !== -1 &&
68654                       ids.indexOf(_washingtonSegmentID) !== -1) {
68655                           var node = selectMenuItem('delete').node();
68656                           if (!node) return;
68657                           continueTo(multiDelete);
68658                   } else if (ids.length === 1 &&
68659                       ids.indexOf(_washingtonSegmentID) !== -1) {
68660                       return continueTo(multiSelect);
68661                   } else {
68662                       return continueTo(didSplit);
68663                   }
68664               }, 300);  // after edit menu visible
68665           }, true);
68666
68667           context.history().on('change.intro', function() {
68668               if (!_washingtonSegmentID ||
68669                   !context.hasEntity(_washingtonSegmentID) ||
68670                   !context.hasEntity(washingtonStreetID) ||
68671                   !context.hasEntity(twelfthAvenueID) ||
68672                   !context.hasEntity(eleventhAvenueEndID)) {
68673                   return continueTo(rightClickIntersection);
68674               }
68675           });
68676
68677           function continueTo(nextStep) {
68678               context.map().on('move.intro drawn.intro', null);
68679               select(window).on('click.intro contextmenu.intro', null, true);
68680               context.history().on('change.intro', null);
68681               nextStep();
68682           }
68683       }
68684
68685
68686       function multiDelete() {
68687           if (!_washingtonSegmentID ||
68688               !context.hasEntity(_washingtonSegmentID) ||
68689               !context.hasEntity(washingtonStreetID) ||
68690               !context.hasEntity(twelfthAvenueID) ||
68691               !context.hasEntity(eleventhAvenueEndID)) {
68692               return continueTo(rightClickIntersection);
68693           }
68694
68695           var node = selectMenuItem('delete').node();
68696           if (!node) return continueTo(multiRightClick);
68697
68698           var menuCoords = context.map().mouseCoordinates();
68699           revealEditMenu(menuCoords,
68700               t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') })
68701           );
68702
68703           context.map().on('move.intro drawn.intro', function() {
68704               revealEditMenu(menuCoords,
68705                   t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') }),
68706                   { duration: 0 }
68707               );
68708           });
68709
68710           context.on('exit.intro', function() {
68711               if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
68712                   return continueTo(multiSelect);  // left select mode but roads still exist
68713               }
68714           });
68715
68716           context.history().on('change.intro', function() {
68717               if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
68718                   continueTo(retryDelete);         // changed something but roads still exist
68719               } else {
68720                   continueTo(play);
68721               }
68722           });
68723
68724           function continueTo(nextStep) {
68725               context.map().on('move.intro drawn.intro', null);
68726               context.on('exit.intro', null);
68727               context.history().on('change.intro', null);
68728               nextStep();
68729           }
68730       }
68731
68732
68733       function retryDelete() {
68734           context.enter(modeBrowse(context));
68735
68736           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
68737           var box = pad$1(twelfthAvenue, padding, context);
68738           reveal(box, t('intro.lines.retry_delete'), {
68739               buttonText: t('intro.ok'),
68740               buttonCallback: function() { continueTo(multiSelect); }
68741           });
68742
68743           function continueTo(nextStep) {
68744               nextStep();
68745           }
68746       }
68747
68748
68749       function play() {
68750           dispatch$1.call('done');
68751           reveal('#id-container',
68752               t('intro.lines.play', { next: t('intro.buildings.title') }), {
68753                   tooltipBox: '.intro-nav-wrap .chapter-building',
68754                   buttonText: t('intro.ok'),
68755                   buttonCallback: function() { reveal('#id-container'); }
68756               }
68757           );
68758      }
68759
68760
68761       chapter.enter = function() {
68762           addLine();
68763       };
68764
68765
68766       chapter.exit = function() {
68767           timeouts.forEach(window.clearTimeout);
68768           select(window).on('mousedown.intro', null, true);
68769           context.on('enter.intro exit.intro', null);
68770           context.map().on('move.intro drawn.intro', null);
68771           context.history().on('change.intro', null);
68772           select('.inspector-wrap').on('wheel.intro', null);
68773           select('.preset-list-button').on('click.intro', null);
68774       };
68775
68776
68777       chapter.restart = function() {
68778           chapter.exit();
68779           chapter.enter();
68780       };
68781
68782
68783       return utilRebind(chapter, dispatch$1, 'on');
68784   }
68785
68786   function uiIntroBuilding(context, reveal) {
68787       var dispatch$1 = dispatch('done');
68788       var house = [-85.62815, 41.95638];
68789       var tank = [-85.62732, 41.95347];
68790       var buildingCatetory = context.presets().item('category-building');
68791       var housePreset = context.presets().item('building/house');
68792       var tankPreset = context.presets().item('man_made/storage_tank');
68793       var timeouts = [];
68794       var _houseID = null;
68795       var _tankID = null;
68796
68797
68798       var chapter = {
68799           title: 'intro.buildings.title'
68800       };
68801
68802
68803       function timeout(f, t) {
68804           timeouts.push(window.setTimeout(f, t));
68805       }
68806
68807
68808       function eventCancel() {
68809           event.stopPropagation();
68810           event.preventDefault();
68811       }
68812
68813
68814       function revealHouse(center, text, options) {
68815           var padding = 160 * Math.pow(2, context.map().zoom() - 20);
68816           var box = pad$1(center, padding, context);
68817           reveal(box, text, options);
68818       }
68819
68820
68821       function revealTank(center, text, options) {
68822           var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
68823           var box = pad$1(center, padding, context);
68824           reveal(box, text, options);
68825       }
68826
68827
68828       function revealEditMenu(loc, text, options) {
68829           var rect = context.surfaceRect();
68830           var point = context.curtainProjection(loc);
68831           var pad = 40;
68832           var width = 250 + (2 * pad);
68833           var height = 350;
68834           var startX = rect.left + point[0];
68835           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
68836           var box = {
68837               left: left,
68838               top: point[1] + rect.top - 60,
68839               width: width,
68840               height: height
68841           };
68842           reveal(box, text, options);
68843       }
68844
68845
68846       function addHouse() {
68847           context.enter(modeBrowse(context));
68848           context.history().reset('initial');
68849           _houseID = null;
68850
68851           var msec = transitionTime(house, context.map().center());
68852           if (msec) { reveal(null, null, { duration: 0 }); }
68853           context.map().centerZoomEase(house, 19, msec);
68854
68855           timeout(function() {
68856               var tooltip = reveal('button.add-area',
68857                   t('intro.buildings.add_building', { button: icon('#iD-icon-area', 'pre-text') }));
68858
68859               tooltip.selectAll('.tooltip-inner')
68860                   .insert('svg', 'span')
68861                   .attr('class', 'tooltip-illustration')
68862                   .append('use')
68863                   .attr('xlink:href', '#iD-graphic-buildings');
68864
68865               context.on('enter.intro', function(mode) {
68866                   if (mode.id !== 'add-area') return;
68867                   continueTo(startHouse);
68868               });
68869           }, msec + 100);
68870
68871           function continueTo(nextStep) {
68872               context.on('enter.intro', null);
68873               nextStep();
68874           }
68875       }
68876
68877
68878       function startHouse() {
68879           if (context.mode().id !== 'add-area') {
68880               return continueTo(addHouse);
68881           }
68882
68883           _houseID = null;
68884           context.map().zoomEase(20, 500);
68885
68886           timeout(function() {
68887               revealHouse(house, t('intro.buildings.start_building'));
68888
68889               context.map().on('move.intro drawn.intro', function() {
68890                   revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
68891               });
68892
68893               context.on('enter.intro', function(mode) {
68894                   if (mode.id !== 'draw-area') return chapter.restart();
68895                   continueTo(continueHouse);
68896               });
68897
68898           }, 550);  // after easing
68899
68900           function continueTo(nextStep) {
68901               context.map().on('move.intro drawn.intro', null);
68902               context.on('enter.intro', null);
68903               nextStep();
68904           }
68905       }
68906
68907
68908       function continueHouse() {
68909           if (context.mode().id !== 'draw-area') {
68910               return continueTo(addHouse);
68911           }
68912
68913           _houseID = null;
68914
68915           revealHouse(house, t('intro.buildings.continue_building'));
68916
68917           context.map().on('move.intro drawn.intro', function() {
68918               revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
68919           });
68920
68921           context.on('enter.intro', function(mode) {
68922               if (mode.id === 'draw-area') {
68923                   return;
68924               } else if (mode.id === 'select') {
68925                   var graph = context.graph();
68926                   var way = context.entity(context.selectedIDs()[0]);
68927                   var nodes = graph.childNodes(way);
68928                   var points = uniq(nodes).map(function(n) { return context.projection(n.loc); });
68929
68930                   if (isMostlySquare(points)) {
68931                       _houseID = way.id;
68932                       return continueTo(chooseCategoryBuilding);
68933                   } else {
68934                       return continueTo(retryHouse);
68935                   }
68936
68937               } else {
68938                   return chapter.restart();
68939               }
68940           });
68941
68942           function continueTo(nextStep) {
68943               context.map().on('move.intro drawn.intro', null);
68944               context.on('enter.intro', null);
68945               nextStep();
68946           }
68947       }
68948
68949
68950       function retryHouse() {
68951           var onClick = function() { continueTo(addHouse); };
68952
68953           revealHouse(house, t('intro.buildings.retry_building'),
68954               { buttonText: t('intro.ok'), buttonCallback: onClick }
68955           );
68956
68957           context.map().on('move.intro drawn.intro', function() {
68958               revealHouse(house, t('intro.buildings.retry_building'),
68959                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
68960               );
68961           });
68962
68963           function continueTo(nextStep) {
68964               context.map().on('move.intro drawn.intro', null);
68965               nextStep();
68966           }
68967       }
68968
68969
68970       function chooseCategoryBuilding() {
68971           if (!_houseID || !context.hasEntity(_houseID)) {
68972               return addHouse();
68973           }
68974           var ids = context.selectedIDs();
68975           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
68976               context.enter(modeSelect(context, [_houseID]));
68977           }
68978
68979           // disallow scrolling
68980           select('.inspector-wrap').on('wheel.intro', eventCancel);
68981
68982           timeout(function() {
68983               // reset pane, in case user somehow happened to change it..
68984               select('.inspector-wrap .panewrap').style('right', '-100%');
68985
68986               var button = select('.preset-category-building .preset-list-button');
68987
68988               reveal(button.node(),
68989                   t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
68990               );
68991
68992               button.on('click.intro', function() {
68993                   button.on('click.intro', null);
68994                   continueTo(choosePresetHouse);
68995               });
68996
68997           }, 400);  // after preset list pane visible..
68998
68999
69000           context.on('enter.intro', function(mode) {
69001               if (!_houseID || !context.hasEntity(_houseID)) {
69002                   return continueTo(addHouse);
69003               }
69004               var ids = context.selectedIDs();
69005               if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
69006                   return continueTo(chooseCategoryBuilding);
69007               }
69008           });
69009
69010           function continueTo(nextStep) {
69011               select('.inspector-wrap').on('wheel.intro', null);
69012               select('.preset-list-button').on('click.intro', null);
69013               context.on('enter.intro', null);
69014               nextStep();
69015           }
69016       }
69017
69018
69019       function choosePresetHouse() {
69020           if (!_houseID || !context.hasEntity(_houseID)) {
69021               return addHouse();
69022           }
69023           var ids = context.selectedIDs();
69024           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
69025               context.enter(modeSelect(context, [_houseID]));
69026           }
69027
69028           // disallow scrolling
69029           select('.inspector-wrap').on('wheel.intro', eventCancel);
69030
69031           timeout(function() {
69032               // reset pane, in case user somehow happened to change it..
69033               select('.inspector-wrap .panewrap').style('right', '-100%');
69034
69035               var button = select('.preset-building-house .preset-list-button');
69036
69037               reveal(button.node(),
69038                   t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
69039                   { duration: 300 }
69040               );
69041
69042               button.on('click.intro', function() {
69043                   button.on('click.intro', null);
69044                   continueTo(closeEditorHouse);
69045               });
69046
69047           }, 400);  // after preset list pane visible..
69048
69049           context.on('enter.intro', function(mode) {
69050               if (!_houseID || !context.hasEntity(_houseID)) {
69051                   return continueTo(addHouse);
69052               }
69053               var ids = context.selectedIDs();
69054               if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
69055                   return continueTo(chooseCategoryBuilding);
69056               }
69057           });
69058
69059           function continueTo(nextStep) {
69060               select('.inspector-wrap').on('wheel.intro', null);
69061               select('.preset-list-button').on('click.intro', null);
69062               context.on('enter.intro', null);
69063               nextStep();
69064           }
69065       }
69066
69067
69068       function closeEditorHouse() {
69069           if (!_houseID || !context.hasEntity(_houseID)) {
69070               return addHouse();
69071           }
69072           var ids = context.selectedIDs();
69073           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
69074               context.enter(modeSelect(context, [_houseID]));
69075           }
69076
69077           context.history().checkpoint('hasHouse');
69078
69079           context.on('exit.intro', function() {
69080               continueTo(rightClickHouse);
69081           });
69082
69083           timeout(function() {
69084               reveal('.entity-editor-pane',
69085                   t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
69086               );
69087           }, 500);
69088
69089           function continueTo(nextStep) {
69090               context.on('exit.intro', null);
69091               nextStep();
69092           }
69093       }
69094
69095
69096       function rightClickHouse() {
69097           if (!_houseID) return chapter.restart();
69098
69099           context.enter(modeBrowse(context));
69100           context.history().reset('hasHouse');
69101           var zoom = context.map().zoom();
69102           if (zoom < 20) {
69103               zoom = 20;
69104           }
69105           context.map().centerZoomEase(house, zoom, 500);
69106
69107           context.on('enter.intro', function(mode) {
69108               if (mode.id !== 'select') return;
69109               var ids = context.selectedIDs();
69110               if (ids.length !== 1 || ids[0] !== _houseID) return;
69111
69112               timeout(function() {
69113                   var node = selectMenuItem('orthogonalize').node();
69114                   if (!node) return;
69115                   continueTo(clickSquare);
69116               }, 300);  // after menu visible
69117           });
69118
69119           context.map().on('move.intro drawn.intro', function() {
69120               revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
69121           });
69122
69123           context.history().on('change.intro', function() {
69124               continueTo(rightClickHouse);
69125           });
69126
69127           function continueTo(nextStep) {
69128               context.on('enter.intro', null);
69129               context.map().on('move.intro drawn.intro', null);
69130               context.history().on('change.intro', null);
69131               nextStep();
69132           }
69133       }
69134
69135
69136       function clickSquare() {
69137           if (!_houseID) return chapter.restart();
69138           var entity = context.hasEntity(_houseID);
69139           if (!entity) return continueTo(rightClickHouse);
69140
69141           var node = selectMenuItem('orthogonalize').node();
69142           if (!node) { return continueTo(rightClickHouse); }
69143
69144           var wasChanged = false;
69145           var menuCoords = context.map().mouseCoordinates();
69146
69147           revealEditMenu(menuCoords,
69148               t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') })
69149           );
69150
69151           context.on('enter.intro', function(mode) {
69152               if (mode.id === 'browse') {
69153                   continueTo(rightClickHouse);
69154               } else if (mode.id === 'move' || mode.id === 'rotate') {
69155                   continueTo(retryClickSquare);
69156               }
69157           });
69158
69159           context.map().on('move.intro drawn.intro', function() {
69160               var node = selectMenuItem('orthogonalize').node();
69161               if (!wasChanged && !node) { return continueTo(rightClickHouse); }
69162
69163               revealEditMenu(menuCoords,
69164                   t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') }),
69165                   { duration: 0 }
69166               );
69167           });
69168
69169           context.history().on('change.intro', function() {
69170               wasChanged = true;
69171               context.history().on('change.intro', null);
69172
69173               // Something changed.  Wait for transition to complete and check undo annotation.
69174               timeout(function() {
69175                   if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
69176                       continueTo(doneSquare);
69177                   } else {
69178                       continueTo(retryClickSquare);
69179                   }
69180               }, 500);  // after transitioned actions
69181           });
69182
69183           function continueTo(nextStep) {
69184               context.on('enter.intro', null);
69185               context.map().on('move.intro drawn.intro', null);
69186               context.history().on('change.intro', null);
69187               nextStep();
69188           }
69189       }
69190
69191
69192       function retryClickSquare() {
69193           context.enter(modeBrowse(context));
69194
69195           revealHouse(house, t('intro.buildings.retry_square'), {
69196               buttonText: t('intro.ok'),
69197               buttonCallback: function() { continueTo(rightClickHouse); }
69198           });
69199
69200           function continueTo(nextStep) {
69201               nextStep();
69202           }
69203       }
69204
69205
69206       function doneSquare() {
69207           context.history().checkpoint('doneSquare');
69208
69209           revealHouse(house, t('intro.buildings.done_square'), {
69210               buttonText: t('intro.ok'),
69211               buttonCallback: function() { continueTo(addTank); }
69212           });
69213
69214           function continueTo(nextStep) {
69215               nextStep();
69216           }
69217       }
69218
69219
69220       function addTank() {
69221           context.enter(modeBrowse(context));
69222           context.history().reset('doneSquare');
69223           _tankID = null;
69224
69225           var msec = transitionTime(tank, context.map().center());
69226           if (msec) { reveal(null, null, { duration: 0 }); }
69227           context.map().centerZoomEase(tank, 19.5, msec);
69228
69229           timeout(function() {
69230               reveal('button.add-area',
69231                   t('intro.buildings.add_tank', { button: icon('#iD-icon-area', 'pre-text') })
69232               );
69233
69234               context.on('enter.intro', function(mode) {
69235                   if (mode.id !== 'add-area') return;
69236                   continueTo(startTank);
69237               });
69238           }, msec + 100);
69239
69240           function continueTo(nextStep) {
69241               context.on('enter.intro', null);
69242               nextStep();
69243           }
69244       }
69245
69246
69247       function startTank() {
69248           if (context.mode().id !== 'add-area') {
69249               return continueTo(addTank);
69250           }
69251
69252           _tankID = null;
69253
69254           timeout(function() {
69255               revealTank(tank, t('intro.buildings.start_tank'));
69256
69257               context.map().on('move.intro drawn.intro', function() {
69258                   revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
69259               });
69260
69261               context.on('enter.intro', function(mode) {
69262                   if (mode.id !== 'draw-area') return chapter.restart();
69263                   continueTo(continueTank);
69264               });
69265
69266           }, 550);  // after easing
69267
69268           function continueTo(nextStep) {
69269               context.map().on('move.intro drawn.intro', null);
69270               context.on('enter.intro', null);
69271               nextStep();
69272           }
69273       }
69274
69275
69276       function continueTank() {
69277           if (context.mode().id !== 'draw-area') {
69278               return continueTo(addTank);
69279           }
69280
69281           _tankID = null;
69282
69283           revealTank(tank, t('intro.buildings.continue_tank'));
69284
69285           context.map().on('move.intro drawn.intro', function() {
69286               revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
69287           });
69288
69289           context.on('enter.intro', function(mode) {
69290               if (mode.id === 'draw-area') {
69291                   return;
69292               } else if (mode.id === 'select') {
69293                   _tankID = context.selectedIDs()[0];
69294                   return continueTo(searchPresetTank);
69295               } else {
69296                   return continueTo(addTank);
69297               }
69298           });
69299
69300           function continueTo(nextStep) {
69301               context.map().on('move.intro drawn.intro', null);
69302               context.on('enter.intro', null);
69303               nextStep();
69304           }
69305       }
69306
69307
69308       function searchPresetTank() {
69309           if (!_tankID || !context.hasEntity(_tankID)) {
69310               return addTank();
69311           }
69312           var ids = context.selectedIDs();
69313           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
69314               context.enter(modeSelect(context, [_tankID]));
69315           }
69316
69317           // disallow scrolling
69318           select('.inspector-wrap').on('wheel.intro', eventCancel);
69319
69320           timeout(function() {
69321               // reset pane, in case user somehow happened to change it..
69322               select('.inspector-wrap .panewrap').style('right', '-100%');
69323
69324               select('.preset-search-input')
69325                   .on('keydown.intro', null)
69326                   .on('keyup.intro', checkPresetSearch);
69327
69328               reveal('.preset-search-input',
69329                   t('intro.buildings.search_tank', { preset: tankPreset.name() })
69330               );
69331           }, 400);  // after preset list pane visible..
69332
69333           context.on('enter.intro', function(mode) {
69334               if (!_tankID || !context.hasEntity(_tankID)) {
69335                   return continueTo(addTank);
69336               }
69337
69338               var ids = context.selectedIDs();
69339               if (mode.id !== 'select' || !ids.length || ids[0] !== _tankID) {
69340                   // keep the user's area selected..
69341                   context.enter(modeSelect(context, [_tankID]));
69342
69343                   // reset pane, in case user somehow happened to change it..
69344                   select('.inspector-wrap .panewrap').style('right', '-100%');
69345                   // disallow scrolling
69346                   select('.inspector-wrap').on('wheel.intro', eventCancel);
69347
69348                   select('.preset-search-input')
69349                       .on('keydown.intro', null)
69350                       .on('keyup.intro', checkPresetSearch);
69351
69352                   reveal('.preset-search-input',
69353                       t('intro.buildings.search_tank', { preset: tankPreset.name() })
69354                   );
69355
69356                   context.history().on('change.intro', null);
69357               }
69358           });
69359
69360           function checkPresetSearch() {
69361               var first = select('.preset-list-item:first-child');
69362
69363               if (first.classed('preset-man_made-storage_tank')) {
69364                   reveal(first.select('.preset-list-button').node(),
69365                       t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
69366                       { duration: 300 }
69367                   );
69368
69369                   select('.preset-search-input')
69370                       .on('keydown.intro', eventCancel, true)
69371                       .on('keyup.intro', null);
69372
69373                   context.history().on('change.intro', function() {
69374                       continueTo(closeEditorTank);
69375                   });
69376               }
69377           }
69378
69379           function continueTo(nextStep) {
69380               select('.inspector-wrap').on('wheel.intro', null);
69381               context.on('enter.intro', null);
69382               context.history().on('change.intro', null);
69383               select('.preset-search-input').on('keydown.intro keyup.intro', null);
69384               nextStep();
69385           }
69386       }
69387
69388
69389       function closeEditorTank() {
69390           if (!_tankID || !context.hasEntity(_tankID)) {
69391               return addTank();
69392           }
69393           var ids = context.selectedIDs();
69394           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
69395               context.enter(modeSelect(context, [_tankID]));
69396           }
69397
69398           context.history().checkpoint('hasTank');
69399
69400           context.on('exit.intro', function() {
69401               continueTo(rightClickTank);
69402           });
69403
69404           timeout(function() {
69405               reveal('.entity-editor-pane',
69406                   t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
69407               );
69408           }, 500);
69409
69410           function continueTo(nextStep) {
69411               context.on('exit.intro', null);
69412               nextStep();
69413           }
69414       }
69415
69416
69417       function rightClickTank() {
69418           if (!_tankID) return continueTo(addTank);
69419
69420           context.enter(modeBrowse(context));
69421           context.history().reset('hasTank');
69422           context.map().centerEase(tank, 500);
69423
69424           timeout(function() {
69425               context.on('enter.intro', function(mode) {
69426                   if (mode.id !== 'select') return;
69427                   var ids = context.selectedIDs();
69428                   if (ids.length !== 1 || ids[0] !== _tankID) return;
69429
69430                   timeout(function() {
69431                       var node = selectMenuItem('circularize').node();
69432                       if (!node) return;
69433                       continueTo(clickCircle);
69434                   }, 300);  // after menu visible
69435               });
69436
69437               revealTank(tank, t('intro.buildings.rightclick_tank'));
69438
69439               context.map().on('move.intro drawn.intro', function() {
69440                   revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
69441               });
69442
69443               context.history().on('change.intro', function() {
69444                   continueTo(rightClickTank);
69445               });
69446
69447           }, 600);
69448
69449           function continueTo(nextStep) {
69450               context.on('enter.intro', null);
69451               context.map().on('move.intro drawn.intro', null);
69452               context.history().on('change.intro', null);
69453               nextStep();
69454           }
69455       }
69456
69457
69458       function clickCircle() {
69459           if (!_tankID) return chapter.restart();
69460           var entity = context.hasEntity(_tankID);
69461           if (!entity) return continueTo(rightClickTank);
69462
69463           var node = selectMenuItem('circularize').node();
69464           if (!node) { return continueTo(rightClickTank); }
69465
69466           var wasChanged = false;
69467           var menuCoords = context.map().mouseCoordinates();
69468
69469           revealEditMenu(menuCoords,
69470               t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') })
69471           );
69472
69473           context.on('enter.intro', function(mode) {
69474               if (mode.id === 'browse') {
69475                   continueTo(rightClickTank);
69476               } else if (mode.id === 'move' || mode.id === 'rotate') {
69477                   continueTo(retryClickCircle);
69478               }
69479           });
69480
69481           context.map().on('move.intro drawn.intro', function() {
69482               var node = selectMenuItem('circularize').node();
69483               if (!wasChanged && !node) { return continueTo(rightClickTank); }
69484
69485               revealEditMenu(menuCoords,
69486                   t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') }),
69487                   { duration: 0 }
69488               );
69489           });
69490
69491           context.history().on('change.intro', function() {
69492               wasChanged = true;
69493               context.history().on('change.intro', null);
69494
69495               // Something changed.  Wait for transition to complete and check undo annotation.
69496               timeout(function() {
69497                   if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
69498                       continueTo(play);
69499                   } else {
69500                       continueTo(retryClickCircle);
69501                   }
69502               }, 500);  // after transitioned actions
69503           });
69504
69505           function continueTo(nextStep) {
69506               context.on('enter.intro', null);
69507               context.map().on('move.intro drawn.intro', null);
69508               context.history().on('change.intro', null);
69509               nextStep();
69510           }
69511       }
69512
69513
69514       function retryClickCircle() {
69515           context.enter(modeBrowse(context));
69516
69517           revealTank(tank, t('intro.buildings.retry_circle'), {
69518               buttonText: t('intro.ok'),
69519               buttonCallback: function() { continueTo(rightClickTank); }
69520           });
69521
69522           function continueTo(nextStep) {
69523               nextStep();
69524           }
69525       }
69526
69527
69528       function play() {
69529           dispatch$1.call('done');
69530           reveal('#id-container',
69531               t('intro.buildings.play', { next: t('intro.startediting.title') }), {
69532                   tooltipBox: '.intro-nav-wrap .chapter-startEditing',
69533                   buttonText: t('intro.ok'),
69534                   buttonCallback: function() { reveal('#id-container'); }
69535               }
69536           );
69537       }
69538
69539
69540       chapter.enter = function() {
69541           addHouse();
69542       };
69543
69544
69545       chapter.exit = function() {
69546           timeouts.forEach(window.clearTimeout);
69547           context.on('enter.intro exit.intro', null);
69548           context.map().on('move.intro drawn.intro', null);
69549           context.history().on('change.intro', null);
69550           select('.inspector-wrap').on('wheel.intro', null);
69551           select('.preset-search-input').on('keydown.intro keyup.intro', null);
69552           select('.more-fields .combobox-input').on('click.intro', null);
69553       };
69554
69555
69556       chapter.restart = function() {
69557           chapter.exit();
69558           chapter.enter();
69559       };
69560
69561
69562       return utilRebind(chapter, dispatch$1, 'on');
69563   }
69564
69565   function uiModal(selection, blocking) {
69566       var keybinding = utilKeybinding('modal');
69567       var previous = selection.select('div.modal');
69568       var animate = previous.empty();
69569
69570       previous.transition()
69571           .duration(200)
69572           .style('opacity', 0)
69573           .remove();
69574
69575       var shaded = selection
69576           .append('div')
69577           .attr('class', 'shaded')
69578           .style('opacity', 0);
69579
69580       shaded.close = function() {
69581           shaded
69582               .transition()
69583               .duration(200)
69584               .style('opacity',0)
69585               .remove();
69586
69587           modal
69588               .transition()
69589               .duration(200)
69590               .style('top','0px');
69591
69592           select(document)
69593               .call(keybinding.unbind);
69594       };
69595
69596
69597       var modal = shaded
69598           .append('div')
69599           .attr('class', 'modal fillL col6');
69600
69601       if (!blocking) {
69602           shaded.on('click.remove-modal', function() {
69603               if (event.target === this) {
69604                   shaded.close();
69605               }
69606           });
69607
69608           modal.append('button')
69609               .attr('class', 'close')
69610               .on('click', shaded.close)
69611               .call(svgIcon('#iD-icon-close'));
69612
69613           keybinding
69614               .on('⌫', shaded.close)
69615               .on('⎋', shaded.close);
69616
69617           select(document)
69618               .call(keybinding);
69619       }
69620
69621       modal
69622           .append('div')
69623           .attr('class', 'content');
69624
69625       if (animate) {
69626           shaded.transition().style('opacity', 1);
69627       } else {
69628           shaded.style('opacity', 1);
69629       }
69630
69631
69632       return shaded;
69633   }
69634
69635   function uiIntroStartEditing(context, reveal) {
69636       var dispatch$1 = dispatch('done', 'startEditing');
69637       var modalSelection = select(null);
69638
69639
69640       var chapter = {
69641           title: 'intro.startediting.title'
69642       };
69643
69644       function showHelp() {
69645           reveal('.map-control.help-control',
69646               t('intro.startediting.help', { button: icon('#iD-icon-help', 'pre-text'), key: t('help.key') }), {
69647                   buttonText: t('intro.ok'),
69648                   buttonCallback: function() { shortcuts(); }
69649               }
69650           );
69651       }
69652
69653       function shortcuts() {
69654           reveal('.map-control.help-control',
69655               t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
69656                   buttonText: t('intro.ok'),
69657                   buttonCallback: function() { showSave(); }
69658               }
69659           );
69660       }
69661
69662       function showSave() {
69663           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
69664           reveal('#bar button.save',
69665               t('intro.startediting.save'), {
69666                   buttonText: t('intro.ok'),
69667                   buttonCallback: function() { showStart(); }
69668               }
69669           );
69670       }
69671
69672       function showStart() {
69673           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
69674
69675           modalSelection = uiModal(context.container());
69676
69677           modalSelection.select('.modal')
69678               .attr('class', 'modal-splash modal col6');
69679
69680           modalSelection.selectAll('.close').remove();
69681
69682           var startbutton = modalSelection.select('.content')
69683               .attr('class', 'fillL')
69684               .append('button')
69685                   .attr('class', 'modal-section huge-modal-button')
69686                   .on('click', function() {
69687                       modalSelection.remove();
69688                   });
69689
69690               startbutton
69691                   .append('svg')
69692                   .attr('class', 'illustration')
69693                   .append('use')
69694                   .attr('xlink:href', '#iD-logo-walkthrough');
69695
69696               startbutton
69697                   .append('h2')
69698                   .text(t('intro.startediting.start'));
69699
69700           dispatch$1.call('startEditing');
69701       }
69702
69703
69704       chapter.enter = function() {
69705           showHelp();
69706       };
69707
69708
69709       chapter.exit = function() {
69710           modalSelection.remove();
69711           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
69712       };
69713
69714
69715       return utilRebind(chapter, dispatch$1, 'on');
69716   }
69717
69718   var chapterUi = {
69719       welcome: uiIntroWelcome,
69720       navigation: uiIntroNavigation,
69721       point: uiIntroPoint,
69722       area: uiIntroArea,
69723       line: uiIntroLine,
69724       building: uiIntroBuilding,
69725       startEditing: uiIntroStartEditing
69726   };
69727
69728   var chapterFlow = [
69729       'welcome',
69730       'navigation',
69731       'point',
69732       'area',
69733       'line',
69734       'building',
69735       'startEditing'
69736   ];
69737
69738
69739   function uiIntro(context) {
69740       var INTRO_IMAGERY = 'EsriWorldImageryClarity';
69741       var introGraph = {};
69742       var _currChapter;
69743
69744       // create entities for intro graph and localize names
69745       for (var id in dataIntroGraph) {
69746           introGraph[id] = osmEntity(localize(dataIntroGraph[id]));
69747       }
69748
69749
69750       function intro(selection) {
69751           context.enter(modeBrowse(context));
69752
69753           // Save current map state
69754           var osm = context.connection();
69755           var history = context.history().toJSON();
69756           var hash = window.location.hash;
69757           var center = context.map().center();
69758           var zoom = context.map().zoom();
69759           var background = context.background().baseLayerSource();
69760           var overlays = context.background().overlayLayerSources();
69761           var opacity = d3_selectAll('#map .layer-background').style('opacity');
69762           var caches = osm && osm.caches();
69763           var baseEntities = context.history().graph().base().entities;
69764           var countryCode = services.geocoder.countryCode;
69765
69766           // Show sidebar and disable the sidebar resizing button
69767           // (this needs to be before `context.inIntro(true)`)
69768           context.ui().sidebar.expand();
69769           d3_selectAll('button.sidebar-toggle').classed('disabled', true);
69770
69771           // Block saving
69772           context.inIntro(true);
69773
69774           // Load semi-real data used in intro
69775           if (osm) { osm.toggle(false).reset(); }
69776           context.history().reset();
69777           context.history().merge(values$1(coreGraph().load(introGraph).entities));
69778           context.history().checkpoint('initial');
69779
69780           // Setup imagery
69781           var imagery = context.background().findSource(INTRO_IMAGERY);
69782           if (imagery) {
69783               context.background().baseLayerSource(imagery);
69784           } else {
69785               context.background().bing();
69786           }
69787           overlays.forEach(function(d) {
69788               context.background().toggleOverlayLayer(d);
69789           });
69790
69791           // Setup data layers (only OSM)
69792           var layers = context.layers();
69793           layers.all().forEach(function(item) {
69794               // if the layer has the function `enabled`
69795               if (typeof item.layer.enabled === 'function') {
69796                   item.layer.enabled(item.id === 'osm');
69797               }
69798           });
69799
69800           // Mock geocoder
69801           services.geocoder.countryCode = function(location, callback) {
69802               callback(null, t('intro.graph.countrycode'));
69803           };
69804
69805
69806           d3_selectAll('#map .layer-background').style('opacity', 1);
69807
69808           var curtain = uiCurtain();
69809           selection.call(curtain);
69810
69811           // Store that the user started the walkthrough..
69812           context.storage('walkthrough_started', 'yes');
69813
69814           // Restore previous walkthrough progress..
69815           var storedProgress = context.storage('walkthrough_progress') || '';
69816           var progress = storedProgress.split(';').filter(Boolean);
69817
69818           var chapters = chapterFlow.map(function(chapter, i) {
69819               var s = chapterUi[chapter](context, curtain.reveal)
69820                   .on('done', function() {
69821                       context.presets().init();  // clear away "recent" presets
69822
69823                       buttons.filter(function(d) {
69824                           return d.title === s.title;
69825                       }).classed('finished', true);
69826
69827                       if (i < chapterFlow.length - 1) {
69828                           var next = chapterFlow[i + 1];
69829                           select('button.chapter-' + next)
69830                               .classed('next', true);
69831                       }
69832
69833                       // Store walkthrough progress..
69834                       progress.push(chapter);
69835                       context.storage('walkthrough_progress', uniq(progress).join(';'));
69836                   });
69837               return s;
69838           });
69839
69840           chapters[chapters.length - 1].on('startEditing', function() {
69841               // Store walkthrough progress..
69842               progress.push('startEditing');
69843               context.storage('walkthrough_progress', uniq(progress).join(';'));
69844
69845               // Store if walkthrough is completed..
69846               var incomplete = difference(chapterFlow, progress);
69847               if (!incomplete.length) {
69848                   context.storage('walkthrough_completed', 'yes');
69849               }
69850
69851               curtain.remove();
69852               navwrap.remove();
69853               d3_selectAll('#map .layer-background').style('opacity', opacity);
69854               d3_selectAll('button.sidebar-toggle').classed('disabled', false);
69855               if (osm) { osm.toggle(true).reset().caches(caches); }
69856               context.history().reset().merge(values$1(baseEntities));
69857               context.background().baseLayerSource(background);
69858               overlays.forEach(function(d) { context.background().toggleOverlayLayer(d); });
69859               if (history) { context.history().fromJSON(history, false); }
69860               context.map().centerZoom(center, zoom);
69861               window.location.replace(hash);
69862               services.geocoder.countryCode = countryCode;
69863               context.inIntro(false);
69864           });
69865
69866           var navwrap = selection
69867               .append('div')
69868               .attr('class', 'intro-nav-wrap fillD');
69869
69870           navwrap
69871               .append('svg')
69872               .attr('class', 'intro-nav-wrap-logo')
69873               .append('use')
69874               .attr('xlink:href', '#iD-logo-walkthrough');
69875
69876           var buttonwrap = navwrap
69877               .append('div')
69878               .attr('class', 'joined')
69879               .selectAll('button.chapter');
69880
69881           var buttons = buttonwrap
69882               .data(chapters)
69883               .enter()
69884               .append('button')
69885               .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
69886               .on('click', enterChapter);
69887
69888           buttons
69889               .append('span')
69890               .text(function(d) { return t(d.title); });
69891
69892           buttons
69893               .append('span')
69894               .attr('class', 'status')
69895               .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
69896
69897           enterChapter(chapters[0]);
69898
69899
69900           function enterChapter(newChapter) {
69901               if (_currChapter) { _currChapter.exit(); }
69902               context.enter(modeBrowse(context));
69903
69904               _currChapter = newChapter;
69905               _currChapter.enter();
69906
69907               buttons
69908                   .classed('next', false)
69909                   .classed('active', function(d) {
69910                       return d.title === _currChapter.title;
69911                   });
69912           }
69913       }
69914
69915
69916       return intro;
69917   }
69918
69919   function uiTooltipHtml(text, key, heading) {
69920       var s = '';
69921
69922       if (heading) {
69923           s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
69924       }
69925       if (text) {
69926           s += '<div class="tooltip-text"><span>' + text + '</span></div>';
69927       }
69928       if (key) {
69929           s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
69930               '<span class="keyhint">' + key + '</span></div>';
69931       }
69932
69933       return s;
69934   }
69935
69936   function uiIssues(context) {
69937       var key = t('issues.key');
69938       //var _featureApplicabilityList = d3_select(null);
69939       var _errorsList = select(null);
69940       var _warningsList = select(null);
69941       var _pane = select(null);
69942       var _toggleButton = select(null);
69943       var _shown = false;
69944
69945       context.validator().on('reload.issues_pane', update);
69946
69947       /*function renderIssuesOptions(selection) {
69948           var container = selection.selectAll('.issues-options-container')
69949               .data([0]);
69950
69951           container = container.enter()
69952               .append('div')
69953               .attr('class', 'issues-options-container')
69954               .merge(container);
69955
69956           _featureApplicabilityList = container.selectAll('.feature-applicability-list')
69957               .data([0]);
69958
69959           _featureApplicabilityList = _featureApplicabilityList.enter()
69960               .append('ul')
69961               .attr('class', 'layer-list feature-applicability-list')
69962               .merge(_featureApplicabilityList);
69963
69964           updateFeatureApplicabilityList();
69965       }*/
69966
69967       function addIconBadge(selection) {
69968           var d = 10;
69969           selection.selectAll('svg.icon-badge')
69970               .data([0])
69971               .enter()
69972               .append('svg')
69973               .attr('viewbox', '0 0 ' + d + ' ' + d)
69974               .attr('class', 'icon-badge')
69975               .append('circle')
69976               .attr('cx', d / 2)
69977               .attr('cy', d / 2)
69978               .attr('r', (d / 2) - 1)
69979               .attr('fill', 'currentColor');
69980       }
69981
69982       function renderErrorsList(selection) {
69983           _errorsList = selection.selectAll('.errors-list')
69984               .data([0]);
69985
69986           _errorsList = _errorsList.enter()
69987               .append('ul')
69988               .attr('class', 'layer-list errors-list issues-list')
69989               .merge(_errorsList);
69990
69991           updateErrorsList();
69992       }
69993
69994       function renderWarningsList(selection) {
69995           _warningsList = selection.selectAll('.warnings-list')
69996               .data([0]);
69997
69998           _warningsList = _warningsList.enter()
69999               .append('ul')
70000               .attr('class', 'layer-list warnings-list issues-list')
70001               .merge(_warningsList);
70002
70003           updateWarningsList();
70004       }
70005
70006
70007       function drawIssuesList(selection, issues) {
70008           var items = selection.selectAll('li')
70009               .data(issues, function(d) { return d.id(); });
70010
70011           // Exit
70012           items.exit()
70013               .remove();
70014
70015           // Enter
70016           var itemsEnter = items.enter()
70017               .append('li')
70018               .attr('class', function (d) { return 'issue severity-' + d.severity; })
70019               .on('click', function(d) {
70020                   var extent = d.extent(context.graph());
70021                   if (extent) {
70022                       var msec = 0;
70023                       var view = context.map().trimmedExtent();
70024                       var zoom = context.map().zoom();
70025
70026                       // make sure user can see the issue
70027                       if (!view.contains(extent) || zoom < 19) {
70028                           msec = 250;
70029                           context.map().centerZoomEase(extent.center(), Math.max(zoom, 19), msec);
70030                       }
70031
70032                       // select the first entity
70033                       if (d.entities && d.entities.length) {
70034                           window.setTimeout(function() {
70035                               var ids = d.entities.map(function(e) { return e.id; });
70036                               context.enter(modeSelect(context, [ids[0]]));
70037                               utilHighlightEntities(ids, true, context);
70038                           }, msec);
70039                       }
70040                   }
70041               })
70042               .on('mouseover', function(d) {
70043                   var ids = d.entities.map(function(e) { return e.id; });
70044                   utilHighlightEntities(ids, true, context);
70045               })
70046               .on('mouseout', function(d) {
70047                   var ids = d.entities.map(function(e) { return e.id; });
70048                   utilHighlightEntities(ids, false, context);
70049               });
70050
70051
70052           var messagesEnter = itemsEnter
70053               .append('button')
70054               .attr('class', 'message');
70055
70056           messagesEnter
70057               .call(tooltip()
70058                   .html(true)
70059                   .title(function(d) { return uiTooltipHtml(d.tooltip); })
70060                   .placement('top')
70061               );
70062
70063           messagesEnter
70064               .append('span')
70065               .attr('class', 'issue-icon')
70066               .call(svgIcon('', 'pre-text'));
70067
70068           messagesEnter
70069               .append('span')
70070               .attr('class', 'issue-text');
70071
70072
70073           // Update
70074           items = items
70075               .merge(itemsEnter);
70076
70077           items.select('.issue-icon svg use')     // propagate bound data
70078               .attr('href', function(d) {
70079                   return '#iD-icon-' + (d.severity === 'warning' ? 'alert' : 'error');
70080               });
70081
70082           items.select('.issue-text')     // propagate bound data
70083               .text(function(d) { return d.message; });
70084       }
70085
70086
70087       function renderNoIssuesBox(selection) {
70088           selection
70089               .append('div')
70090               .call(svgIcon('#iD-icon-apply', 'pre-text'));
70091
70092           var noIssuesMessage = selection
70093               .append('span');
70094
70095           noIssuesMessage
70096               .append('strong')
70097               .text(t('issues.no_issues.message'));
70098
70099           noIssuesMessage
70100               .append('br');
70101
70102           noIssuesMessage
70103               .append('span')
70104               .text(t('issues.no_issues.info'));
70105       }
70106
70107       /*
70108       function showsFeatureApplicability(d) {
70109           return context.validator().getFeatureApplicability() === d;
70110       }
70111
70112       function setFeatureApplicability(d) {
70113           context.validator().setFeatureApplicability(d);
70114           update();
70115       }
70116
70117       function updateFeatureApplicabilityList() {
70118           _featureApplicabilityList
70119               .call(
70120                   drawListItems,
70121                   context.validator().featureApplicabilityOptions,
70122                   'radio',
70123                   'features_to_validate',
70124                   setFeatureApplicability,
70125                   showsFeatureApplicability
70126               );
70127       }*/
70128
70129       function updateErrorsList() {
70130           var errors = context.validator().getErrors();
70131           _errorsList
70132               .call(drawIssuesList, errors);
70133       }
70134
70135
70136       function updateWarningsList() {
70137           var warnings = context.validator().getWarnings();
70138           _warningsList
70139               .call(drawIssuesList, warnings);
70140       }
70141
70142
70143       function update() {
70144           var errors = context.validator().getErrors();
70145           var warnings = context.validator().getWarnings();
70146
70147           _toggleButton.selectAll('.icon-badge')
70148               .classed('error', (errors.length > 0))
70149               .classed('warning', (errors.length === 0 && warnings.length > 0))
70150               .classed('hide', (errors.length === 0 && warnings.length === 0));
70151
70152           _pane.select('.issues-errors')
70153               .classed('hide', errors.length === 0);
70154
70155           if (errors.length > 0) {
70156               _pane.select('.hide-toggle-issues_errors .hide-toggle-text')
70157                   .text(t('issues.errors.list_title', { count: errors.length }));
70158               if (!_pane.select('.disclosure-wrap-issues_errors').classed('hide')) {
70159                   updateErrorsList();
70160               }
70161           }
70162
70163           _pane.select('.issues-warnings')
70164               .classed('hide', warnings.length === 0);
70165
70166           if (warnings.length > 0) {
70167               _pane.select('.hide-toggle-issues_warnings .hide-toggle-text')
70168                   .text(t('issues.warnings.list_title', { count: warnings.length }));
70169               if (!_pane.select('.disclosure-wrap-issues_warnings').classed('hide')) {
70170                   updateWarningsList();
70171               }
70172           }
70173
70174           _pane.select('.issues-none')
70175               .classed('hide', warnings.length > 0 || errors.length > 0);
70176
70177           //if (!_pane.select('.disclosure-wrap-issues_options').classed('hide')) {
70178           //    updateFeatureApplicabilityList();
70179           //}
70180       }
70181
70182       var paneTooltip = tooltip()
70183           .placement((textDirection === 'rtl') ? 'right' : 'left')
70184           .html(true)
70185           .title(uiTooltipHtml(t('issues.title'), key));
70186
70187       uiIssues.hidePane = function() {
70188           uiIssues.setVisible(false);
70189       };
70190
70191       uiIssues.togglePane = function() {
70192           if (event) event.preventDefault();
70193           paneTooltip.hide(_toggleButton);
70194           uiIssues.setVisible(!_toggleButton.classed('active'));
70195       };
70196
70197       uiIssues.setVisible = function(show) {
70198           if (show !== _shown) {
70199               _toggleButton.classed('active', show);
70200               _shown = show;
70201
70202               if (show) {
70203                   uiBackground.hidePane();
70204                   uiHelp.hidePane();
70205                   uiMapData.hidePane();
70206                   update();
70207
70208                   _pane
70209                       .style('display', 'block')
70210                       .style('right', '-300px')
70211                       .transition()
70212                       .duration(200)
70213                       .style('right', '0px');
70214
70215               } else {
70216                   _pane
70217                       .style('display', 'block')
70218                       .style('right', '0px')
70219                       .transition()
70220                       .duration(200)
70221                       .style('right', '-300px')
70222                       .on('end', function() {
70223                           select(this).style('display', 'none');
70224                       });
70225               }
70226           }
70227       };
70228
70229       uiIssues.renderToggleButton = function(selection) {
70230
70231           _toggleButton = selection
70232               .append('button')
70233               .attr('tabindex', -1)
70234               .on('click', uiIssues.togglePane)
70235               .call(svgIcon('#iD-icon-alert', 'light'))
70236               .call(addIconBadge)
70237               .call(paneTooltip);
70238
70239       };
70240
70241       uiIssues.renderPane = function(selection) {
70242
70243           _pane = selection
70244               .append('div')
70245               .attr('class', 'fillL map-pane issues-pane hide');
70246
70247           var heading = _pane
70248               .append('div')
70249               .attr('class', 'pane-heading');
70250
70251           heading
70252               .append('h2')
70253               .text(t('issues.title'));
70254
70255           heading
70256               .append('button')
70257               .on('click', uiIssues.hidePane)
70258               .call(svgIcon('#iD-icon-close'));
70259
70260           var content = _pane
70261               .append('div')
70262               .attr('class', 'pane-content');
70263
70264           content
70265               .append('div')
70266               .attr('class', 'issues-none')
70267               .call(renderNoIssuesBox);
70268
70269           // errors
70270           content
70271               .append('div')
70272               .attr('class', 'issues-errors')
70273               .call(uiDisclosure(context, 'issues_errors', true)
70274                   .content(renderErrorsList)
70275               );
70276
70277           // warnings
70278           content
70279               .append('div')
70280               .attr('class', 'issues-warnings')
70281               .call(uiDisclosure(context, 'issues_warnings', true)
70282                   .content(renderWarningsList)
70283               );
70284
70285           // options
70286           /*
70287           // add this back to core.yaml when re-enabling the options
70288           options:
70289             title: Options
70290           features_to_validate:
70291             edited:
70292               description: Edited features only
70293               tooltip: Flag issues with features you create and modify
70294             all:
70295               description: All features
70296               tooltip: Flag issues with all nearby features
70297
70298           content
70299               .append('div')
70300               .attr('class', 'issues-options')
70301               .call(uiDisclosure(context, 'issues_options', true)
70302                   .title(t('issues.options.title'))
70303                   .content(renderIssuesOptions)
70304               );
70305           */
70306           update();
70307
70308           context.keybinding()
70309               .on(key, uiIssues.togglePane);
70310       };
70311
70312       return uiIssues;
70313   }
70314
70315   function uiConfirm(selection) {
70316       var modalSelection = uiModal(selection);
70317
70318       modalSelection.select('.modal')
70319           .classed('modal-alert', true);
70320
70321       var section = modalSelection.select('.content');
70322
70323       section.append('div')
70324           .attr('class', 'modal-section header');
70325
70326       section.append('div')
70327           .attr('class', 'modal-section message-text');
70328
70329       var buttons = section.append('div')
70330           .attr('class', 'modal-section buttons cf');
70331
70332
70333       modalSelection.okButton = function() {
70334           buttons
70335               .append('button')
70336               .attr('class', 'button ok-button action')
70337               .on('click.confirm', function() {
70338                   modalSelection.remove();
70339               })
70340               .text(t('confirm.okay'))
70341               .node()
70342               .focus();
70343
70344           return modalSelection;
70345       };
70346
70347
70348       return modalSelection;
70349   }
70350
70351   function uiSettingsCustomData(context) {
70352       var dispatch$1 = dispatch('change');
70353
70354       function render(selection) {
70355           var dataLayer = context.layers().layer('data');
70356           var _origSettings = {
70357               fileList: (dataLayer && dataLayer.fileList()) || null,
70358               url: context.storage('settings-custom-data-url')
70359           };
70360           var _currSettings = cloneDeep(_origSettings);
70361
70362           // var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
70363           var modal = uiConfirm(selection).okButton();
70364
70365           modal
70366               .classed('settings-modal settings-custom-data', true);
70367
70368           modal.select('.modal-section.header')
70369               .append('h3')
70370               .text(t('settings.custom_data.header'));
70371
70372
70373           var textSection = modal.select('.modal-section.message-text');
70374
70375           textSection
70376               .append('pre')
70377               .attr('class', 'instructions-file')
70378               .text(t('settings.custom_data.file.instructions'));
70379
70380           textSection
70381               .append('input')
70382               .attr('class', 'field-file')
70383               .attr('type', 'file')
70384               .property('files', _currSettings.fileList)  // works for all except IE11
70385               .on('change', function() {
70386                   var files = event.target.files;
70387                   if (files && files.length) {
70388                       _currSettings.url = '';
70389                       textSection.select('.field-url').property('value', '');
70390                       _currSettings.fileList = files;
70391                   } else {
70392                       _currSettings.fileList = null;
70393                   }
70394               });
70395
70396           textSection
70397               .append('h4')
70398               .text(t('settings.custom_data.or'));
70399
70400           textSection
70401               .append('pre')
70402               .attr('class', 'instructions-url')
70403               .text(t('settings.custom_data.url.instructions'));
70404
70405           textSection
70406               .append('textarea')
70407               .attr('class', 'field-url')
70408               .attr('placeholder', t('settings.custom_data.url.placeholder'))
70409               .call(utilNoAuto)
70410               .property('value', _currSettings.url);
70411
70412
70413           // insert a cancel button
70414           var buttonSection = modal.select('.modal-section.buttons');
70415
70416           buttonSection
70417               .insert('button', '.ok-button')
70418               .attr('class', 'button cancel-button secondary-action')
70419               .text(t('confirm.cancel'));
70420
70421
70422           buttonSection.select('.cancel-button')
70423               .on('click.cancel', clickCancel);
70424
70425           buttonSection.select('.ok-button')
70426               .attr('disabled', isSaveDisabled)
70427               .on('click.save', clickSave);
70428
70429
70430           function isSaveDisabled() {
70431               return null;
70432           }
70433
70434
70435           // restore the original url
70436           function clickCancel() {
70437               textSection.select('.field-url').property('value', _origSettings.url);
70438               context.storage('settings-custom-data-url', _origSettings.url);
70439               this.blur();
70440               modal.close();
70441           }
70442
70443           // accept the current url
70444           function clickSave() {
70445               _currSettings.url = textSection.select('.field-url').property('value').trim();
70446
70447               // one or the other but not both
70448               if (_currSettings.url) { _currSettings.fileList = null; }
70449               if (_currSettings.fileList) { _currSettings.url = ''; }
70450
70451               context.storage('settings-custom-data-url', _currSettings.url);
70452               this.blur();
70453               modal.close();
70454               dispatch$1.call('change', this, _currSettings);
70455           }
70456       }
70457
70458       return utilRebind(render, dispatch$1, 'on');
70459   }
70460
70461   function uiMapData(context) {
70462       var key = t('map_data.key');
70463       var features = context.features().keys();
70464       var layers = context.layers();
70465       var fills = ['wireframe', 'partial', 'full'];
70466
70467       var settingsCustomData = uiSettingsCustomData(context)
70468           .on('change', customChanged);
70469
70470       var _pane = select(null), _toggleButton = select(null);
70471
70472       var _fillSelected = context.storage('area-fill') || 'partial';
70473       var _shown = false;
70474       var _dataLayerContainer = select(null);
70475       var _fillList = select(null);
70476       var _featureList = select(null);
70477       var _QAList = select(null);
70478
70479
70480       function showsFeature(d) {
70481           return context.features().enabled(d);
70482       }
70483
70484
70485       function autoHiddenFeature(d) {
70486           if (d.type === 'kr_error') return context.errors().autoHidden(d);
70487           return context.features().autoHidden(d);
70488       }
70489
70490
70491       function clickFeature(d) {
70492           context.features().toggle(d);
70493           update();
70494       }
70495
70496
70497       function showsQA(d) {
70498           var QAKeys = [d];
70499           var QALayers = layers.all().filter(function(obj) { return QAKeys.indexOf(obj.id) !== -1; });
70500           var data = QALayers.filter(function(obj) { return obj.layer.supported(); });
70501
70502           function layerSupported(d) {
70503               return d.layer && d.layer.supported();
70504           }
70505           function layerEnabled(d) {
70506               return layerSupported(d) && d.layer.enabled();
70507           }
70508
70509           return layerEnabled(data[0]);
70510       }
70511
70512
70513       function showsFill(d) {
70514           return _fillSelected === d;
70515       }
70516
70517
70518       function setFill(d) {
70519           fills.forEach(function(opt) {
70520               context.surface().classed('fill-' + opt, Boolean(opt === d));
70521           });
70522
70523           _fillSelected = d;
70524           context.storage('area-fill', d);
70525           if (d !== 'wireframe') {
70526               context.storage('area-fill-toggle', d);
70527           }
70528           update();
70529       }
70530
70531
70532       function showsLayer(which) {
70533           var layer = layers.layer(which);
70534           if (layer) {
70535               return layer.enabled();
70536           }
70537           return false;
70538       }
70539
70540
70541       function setLayer(which, enabled) {
70542           var layer = layers.layer(which);
70543           if (layer) {
70544               layer.enabled(enabled);
70545
70546               if (!enabled && (which === 'osm' || which === 'notes')) {
70547                   context.enter(modeBrowse(context));
70548               }
70549
70550               update();
70551           }
70552       }
70553
70554
70555       function toggleLayer(which) {
70556           setLayer(which, !showsLayer(which));
70557       }
70558
70559
70560       function drawPhotoItems(selection) {
70561           var photoKeys = ['streetside', 'mapillary-images', 'mapillary-signs', 'openstreetcam-images'];
70562           var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; });
70563           var data = photoLayers.filter(function(obj) { return obj.layer.supported(); });
70564
70565           function layerSupported(d) {
70566               return d.layer && d.layer.supported();
70567           }
70568           function layerEnabled(d) {
70569               return layerSupported(d) && d.layer.enabled();
70570           }
70571
70572           var ul = selection
70573               .selectAll('.layer-list-photos')
70574               .data([0]);
70575
70576           ul = ul.enter()
70577               .append('ul')
70578               .attr('class', 'layer-list layer-list-photos')
70579               .merge(ul);
70580
70581           var li = ul.selectAll('.list-item-photos')
70582               .data(data);
70583
70584           li.exit()
70585               .remove();
70586
70587           var liEnter = li.enter()
70588               .append('li')
70589               .attr('class', function(d) { return 'list-item-photos list-item-' + d.id; });
70590
70591           var labelEnter = liEnter
70592               .append('label')
70593               .each(function(d) {
70594                   select(this)
70595                       .call(tooltip()
70596                           .title(t(d.id.replace('-', '_') + '.tooltip'))
70597                           .placement('top')
70598                       );
70599               });
70600
70601           labelEnter
70602               .append('input')
70603               .attr('type', 'checkbox')
70604               .on('change', function(d) { toggleLayer(d.id); });
70605
70606           labelEnter
70607               .append('span')
70608               .text(function(d) { return t(d.id.replace('-', '_') + '.title'); });
70609
70610
70611           // Update
70612           li
70613               .merge(liEnter)
70614               .classed('active', layerEnabled)
70615               .selectAll('input')
70616               .property('checked', layerEnabled);
70617       }
70618
70619
70620       function drawOsmItems(selection) {
70621           var osmKeys = ['osm', 'notes'];
70622           var osmLayers = layers.all().filter(function(obj) { return osmKeys.indexOf(obj.id) !== -1; });
70623
70624           var ul = selection
70625               .selectAll('.layer-list-osm')
70626               .data([0]);
70627
70628           ul = ul.enter()
70629               .append('ul')
70630               .attr('class', 'layer-list layer-list-osm')
70631               .merge(ul);
70632
70633           var li = ul.selectAll('.list-item')
70634               .data(osmLayers);
70635
70636           li.exit()
70637               .remove();
70638
70639           var liEnter = li.enter()
70640               .append('li')
70641               .attr('class', function(d) { return 'list-item list-item-' + d.id; });
70642
70643           var labelEnter = liEnter
70644               .append('label')
70645               .each(function(d) {
70646                   select(this)
70647                       .call(tooltip()
70648                           .title(t('map_data.layers.' + d.id + '.tooltip'))
70649                           .placement('bottom')
70650                       );
70651               });
70652
70653           labelEnter
70654               .append('input')
70655               .attr('type', 'checkbox')
70656               .on('change', function(d) { toggleLayer(d.id); });
70657
70658           labelEnter
70659               .append('span')
70660               .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
70661
70662
70663           // Update
70664           li
70665               .merge(liEnter)
70666               .classed('active', function (d) { return d.layer.enabled(); })
70667               .selectAll('input')
70668               .property('checked', function (d) { return d.layer.enabled(); });
70669       }
70670
70671
70672       function drawQAItems(selection) {
70673           var qaKeys = ['keepRight', 'improveOSM'];
70674           var qaLayers = layers.all().filter(function(obj) { return qaKeys.indexOf(obj.id) !== -1; });
70675
70676           var ul = selection
70677               .selectAll('.layer-list-qa')
70678               .data([0]);
70679
70680           ul = ul.enter()
70681               .append('ul')
70682               .attr('class', 'layer-list layer-list-qa')
70683               .merge(ul);
70684
70685           var li = ul.selectAll('.list-item')
70686               .data(qaLayers);
70687
70688           li.exit()
70689               .remove();
70690
70691           var liEnter = li.enter()
70692               .append('li')
70693               .attr('class', function(d) { return 'list-item list-item-' + d.id; });
70694
70695           var labelEnter = liEnter
70696               .append('label')
70697               .each(function(d) {
70698                   select(this)
70699                       .call(tooltip()
70700                           .title(t('map_data.layers.' + d.id + '.tooltip'))
70701                           .placement('bottom')
70702                       );
70703               });
70704
70705           labelEnter
70706               .append('input')
70707               .attr('type', 'checkbox')
70708               .on('change', function(d) { toggleLayer(d.id); });
70709
70710           labelEnter
70711               .append('span')
70712               .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
70713
70714
70715           // Update
70716           li
70717               .merge(liEnter)
70718               .classed('active', function (d) { return d.layer.enabled(); })
70719               .selectAll('input')
70720               .property('checked', function (d) { return d.layer.enabled(); });
70721       }
70722
70723
70724       // Beta feature - sample vector layers to support Detroit Mapping Challenge
70725       // https://github.com/osmus/detroit-mapping-challenge
70726       function drawVectorItems(selection) {
70727           var dataLayer = layers.layer('data');
70728           var vtData = [
70729               {
70730                   name: 'Detroit Neighborhoods/Parks',
70731                   src: 'neighborhoods-parks',
70732                   tooltip: 'Neighborhood boundaries and parks as compiled by City of Detroit in concert with community groups.',
70733                   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'
70734               }, {
70735                   name: 'Detroit Composite POIs',
70736                   src: 'composite-poi',
70737                   tooltip: 'Fire Inspections, Business Licenses, and other public location data collated from the City of Detroit.',
70738                   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'
70739               }, {
70740                   name: 'Detroit All-The-Places POIs',
70741                   src: 'alltheplaces-poi',
70742                   tooltip: 'Public domain business location data created by web scrapers.',
70743                   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'
70744               }
70745           ];
70746
70747           // Only show this if the map is around Detroit..
70748           var detroit = geoExtent([-83.5, 42.1], [-82.8, 42.5]);
70749           var showVectorItems = (context.map().zoom() > 9 && detroit.contains(context.map().center()));
70750
70751           var container = selection.selectAll('.vectortile-container')
70752               .data(showVectorItems ? [0] : []);
70753
70754           container.exit()
70755               .remove();
70756
70757           var containerEnter = container.enter()
70758               .append('div')
70759               .attr('class', 'vectortile-container');
70760
70761           containerEnter
70762               .append('h4')
70763               .attr('class', 'vectortile-header')
70764               .text('Detroit Vector Tiles (Beta)');
70765
70766           containerEnter
70767               .append('ul')
70768               .attr('class', 'layer-list layer-list-vectortile');
70769
70770           containerEnter
70771               .append('div')
70772               .attr('class', 'vectortile-footer')
70773               .append('a')
70774               .attr('target', '_blank')
70775               .attr('tabindex', -1)
70776               .call(svgIcon('#iD-icon-out-link', 'inline'))
70777               .attr('href', 'https://github.com/osmus/detroit-mapping-challenge')
70778               .append('span')
70779               .text('About these layers');
70780
70781           container = container
70782               .merge(containerEnter);
70783
70784
70785           var ul = container.selectAll('.layer-list-vectortile');
70786
70787           var li = ul.selectAll('.list-item')
70788               .data(vtData);
70789
70790           li.exit()
70791               .remove();
70792
70793           var liEnter = li.enter()
70794               .append('li')
70795               .attr('class', function(d) { return 'list-item list-item-' + d.src; });
70796
70797           var labelEnter = liEnter
70798               .append('label')
70799               .each(function(d) {
70800                   select(this).call(
70801                       tooltip().title(d.tooltip).placement('top')
70802                   );
70803               });
70804
70805           labelEnter
70806               .append('input')
70807               .attr('type', 'radio')
70808               .attr('name', 'vectortile')
70809               .on('change', selectVTLayer);
70810
70811           labelEnter
70812               .append('span')
70813               .text(function(d) { return d.name; });
70814
70815           // Update
70816           li
70817               .merge(liEnter)
70818               .classed('active', isVTLayerSelected)
70819               .selectAll('input')
70820               .property('checked', isVTLayerSelected);
70821
70822
70823           function isVTLayerSelected(d) {
70824               return dataLayer && dataLayer.template() === d.template;
70825           }
70826
70827           function selectVTLayer(d) {
70828               context.storage('settings-custom-data-url', d.template);
70829               if (dataLayer) {
70830                   dataLayer.template(d.template, d.src);
70831                   dataLayer.enabled(true);
70832               }
70833           }
70834       }
70835
70836
70837       function drawCustomDataItems(selection) {
70838           var dataLayer = layers.layer('data');
70839           var hasData = dataLayer && dataLayer.hasData();
70840           var showsData = hasData && dataLayer.enabled();
70841
70842           var ul = selection
70843               .selectAll('.layer-list-data')
70844               .data(dataLayer ? [0] : []);
70845
70846           // Exit
70847           ul.exit()
70848               .remove();
70849
70850           // Enter
70851           var ulEnter = ul.enter()
70852               .append('ul')
70853               .attr('class', 'layer-list layer-list-data');
70854
70855           var liEnter = ulEnter
70856               .append('li')
70857               .attr('class', 'list-item-data');
70858
70859           liEnter
70860               .append('button')
70861               .call(tooltip()
70862                   .title(t('settings.custom_data.tooltip'))
70863                   .placement((textDirection === 'rtl') ? 'right' : 'left')
70864               )
70865               .on('click', editCustom)
70866               .call(svgIcon('#iD-icon-more'));
70867
70868           liEnter
70869               .append('button')
70870               .call(tooltip()
70871                   .title(t('map_data.layers.custom.zoom'))
70872                   .placement((textDirection === 'rtl') ? 'right' : 'left')
70873               )
70874               .on('click', function() {
70875                   event.preventDefault();
70876                   event.stopPropagation();
70877                   dataLayer.fitZoom();
70878               })
70879               .call(svgIcon('#iD-icon-search'));
70880
70881           var labelEnter = liEnter
70882               .append('label')
70883               .call(tooltip()
70884                   .title(t('map_data.layers.custom.tooltip'))
70885                   .placement('top')
70886               );
70887
70888           labelEnter
70889               .append('input')
70890               .attr('type', 'checkbox')
70891               .on('change', function() { toggleLayer('data'); });
70892
70893           labelEnter
70894               .append('span')
70895               .text(t('map_data.layers.custom.title'));
70896
70897           // Update
70898           ul = ul
70899               .merge(ulEnter);
70900
70901           ul.selectAll('.list-item-data')
70902               .classed('active', showsData)
70903               .selectAll('label')
70904               .classed('deemphasize', !hasData)
70905               .selectAll('input')
70906               .property('disabled', !hasData)
70907               .property('checked', showsData);
70908       }
70909
70910
70911       function editCustom() {
70912           event.preventDefault();
70913           context.container()
70914               .call(settingsCustomData);
70915       }
70916
70917
70918       function customChanged(d) {
70919           var dataLayer = layers.layer('data');
70920
70921           if (d && d.url) {
70922               dataLayer.url(d.url);
70923           } else if (d && d.fileList) {
70924               dataLayer.fileList(d.fileList);
70925           }
70926       }
70927
70928
70929       function drawListItems(selection, data, type, name, change, active) {
70930           var items = selection.selectAll('li')
70931               .data(data);
70932
70933           // Exit
70934           items.exit()
70935               .remove();
70936
70937           // Enter
70938           var enter = items.enter()
70939               .append('li')
70940               .call(tooltip()
70941                   .html(true)
70942                   .title(function(d) {
70943                       var tip = t(name + '.' + d + '.tooltip');
70944                       var key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
70945                       if ((name === 'feature' || name === 'keepRight') && autoHiddenFeature(d)) {
70946                           var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
70947                           tip += '<div>' + msg + '</div>';
70948                       }
70949                       return uiTooltipHtml(tip, key);
70950                   })
70951                   .placement('top')
70952               );
70953
70954           var label = enter
70955               .append('label');
70956
70957           label
70958               .append('input')
70959               .attr('type', type)
70960               .attr('name', name)
70961               .on('change', change);
70962
70963           label
70964               .append('span')
70965               .text(function(d) { return t(name + '.' + d + '.description'); });
70966
70967           // Update
70968           items = items
70969               .merge(enter);
70970
70971           items
70972               .classed('active', active)
70973               .selectAll('input')
70974               .property('checked', active)
70975               .property('indeterminate', function(d) {
70976                   return ((name === 'feature' || name === 'keepRight') && autoHiddenFeature(d));
70977               });
70978       }
70979
70980
70981       function renderDataLayers(selection) {
70982           var container = selection.selectAll('.data-layer-container')
70983               .data([0]);
70984
70985           _dataLayerContainer = container.enter()
70986               .append('div')
70987               .attr('class', 'data-layer-container')
70988               .merge(container);
70989
70990           updateDataLayers();
70991       }
70992
70993
70994       function renderFillList(selection) {
70995           var container = selection.selectAll('.layer-fill-list')
70996               .data([0]);
70997
70998           _fillList = container.enter()
70999               .append('ul')
71000               .attr('class', 'layer-list layer-fill-list')
71001               .merge(container);
71002
71003           updateFillList();
71004       }
71005
71006
71007       function renderFeatureList(selection) {
71008           var container = selection.selectAll('.layer-feature-list')
71009               .data([0]);
71010
71011           _featureList = container.enter()
71012               .append('ul')
71013               .attr('class', 'layer-list layer-feature-list')
71014               .merge(container);
71015
71016           updateFeatureList();
71017       }
71018
71019       function updateDataLayers() {
71020           _dataLayerContainer
71021               .call(drawOsmItems)
71022               .call(drawQAItems)
71023               .call(drawPhotoItems)
71024               .call(drawCustomDataItems)
71025               .call(drawVectorItems);      // Beta - Detroit mapping challenge
71026       }
71027
71028       function updateFillList() {
71029           _fillList
71030               .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill);
71031       }
71032
71033       function updateFeatureList() {
71034           _featureList
71035               .call(drawListItems, features, 'checkbox', 'feature', clickFeature, showsFeature);
71036       }
71037
71038       function update() {
71039
71040           if (!_pane.select('.disclosure-wrap-data_layers').classed('hide')) {
71041               updateDataLayers();
71042           }
71043           if (!_pane.select('.disclosure-wrap-fill_area').classed('hide')) {
71044               updateFillList();
71045           }
71046           if (!_pane.select('.disclosure-wrap-map_features').classed('hide')) {
71047               updateFeatureList();
71048           }
71049
71050           _QAList
71051               .call(drawListItems, ['keep-right'], 'checkbox', 'QA', function(d) { toggleLayer(d); }, showsQA);
71052       }
71053
71054
71055       function toggleWireframe() {
71056           if (event) {
71057               event.preventDefault();
71058               event.stopPropagation();
71059           }
71060
71061           if (_fillSelected === 'wireframe') {
71062               _fillSelected = context.storage('area-fill-toggle') || 'partial';
71063           } else {
71064               _fillSelected = 'wireframe';
71065           }
71066
71067           setFill(_fillSelected);
71068           context.map().pan([0,0]);  // trigger a redraw
71069       }
71070
71071       var paneTooltip = tooltip()
71072           .placement((textDirection === 'rtl') ? 'right' : 'left')
71073           .html(true)
71074           .title(uiTooltipHtml(t('map_data.description'), key));
71075
71076       uiMapData.hidePane = function() {
71077           uiMapData.setVisible(false);
71078       };
71079
71080       uiMapData.togglePane = function() {
71081           if (event) event.preventDefault();
71082           paneTooltip.hide(_toggleButton);
71083           uiMapData.setVisible(!_toggleButton.classed('active'));
71084       };
71085
71086       uiMapData.setVisible = function(show) {
71087           if (show !== _shown) {
71088               _toggleButton.classed('active', show);
71089               _shown = show;
71090
71091               if (show) {
71092                   uiBackground.hidePane();
71093                   uiHelp.hidePane();
71094                   uiIssues.hidePane();
71095                   update();
71096
71097                   _pane
71098                       .style('display', 'block')
71099                       .style('right', '-300px')
71100                       .transition()
71101                       .duration(200)
71102                       .style('right', '0px');
71103
71104               } else {
71105                   _pane
71106                       .style('display', 'block')
71107                       .style('right', '0px')
71108                       .transition()
71109                       .duration(200)
71110                       .style('right', '-300px')
71111                       .on('end', function() {
71112                           select(this).style('display', 'none');
71113                       });
71114               }
71115           }
71116       };
71117
71118       uiMapData.renderToggleButton = function(selection) {
71119
71120           _toggleButton = selection
71121               .append('button')
71122               .attr('tabindex', -1)
71123               .on('click', uiMapData.togglePane)
71124               .call(svgIcon('#iD-icon-data', 'light'))
71125               .call(paneTooltip);
71126       };
71127
71128
71129       uiMapData.renderPane = function(selection) {
71130
71131           _pane = selection
71132               .append('div')
71133               .attr('class', 'fillL map-pane map-data-pane hide');
71134
71135           var heading = _pane
71136               .append('div')
71137               .attr('class', 'pane-heading');
71138
71139           heading
71140               .append('h2')
71141               .text(t('map_data.title'));
71142
71143           heading
71144               .append('button')
71145               .on('click', uiMapData.hidePane)
71146               .call(svgIcon('#iD-icon-close'));
71147
71148
71149           var content = _pane
71150               .append('div')
71151               .attr('class', 'pane-content');
71152
71153
71154           // data layers
71155           content
71156               .append('div')
71157               .attr('class', 'map-data-data-layers')
71158               .call(uiDisclosure(context, 'data_layers', true)
71159                   .title(t('map_data.data_layers'))
71160                   .content(renderDataLayers)
71161               );
71162
71163           // area fills
71164           content
71165               .append('div')
71166               .attr('class', 'map-data-area-fills')
71167               .call(uiDisclosure(context, 'fill_area', false)
71168                   .title(t('map_data.fill_area'))
71169                   .content(renderFillList)
71170               );
71171
71172           // feature filters
71173           content
71174               .append('div')
71175               .attr('class', 'map-data-feature-filters')
71176               .call(uiDisclosure(context, 'map_features', false)
71177                   .title(t('map_data.map_features'))
71178                   .content(renderFeatureList)
71179               );
71180
71181
71182           // add listeners
71183           context.features()
71184               .on('change.map_data-update', update);
71185
71186           update();
71187           setFill(_fillSelected);
71188
71189           context.keybinding()
71190               .on(key, uiMapData.togglePane)
71191               .on(t('area_fill.wireframe.key'), toggleWireframe);
71192       };
71193
71194       return uiMapData;
71195   }
71196
71197   function uiShortcuts(context) {
71198       var detected = utilDetect();
71199       var _activeTab = 0;
71200       var _modalSelection;
71201       var _selection = select(null);
71202
71203
71204       context.keybinding()
71205           .on([t('shortcuts.toggle.key'), '?'], function () {
71206               if (d3_selectAll('.modal-shortcuts').size()) {  // already showing
71207                   if (_modalSelection) {
71208                       _modalSelection.close();
71209                       _modalSelection = null;
71210                   }
71211               } else {
71212                   _modalSelection = uiModal(_selection);
71213                   shortcutsModal(_modalSelection);
71214               }
71215           });
71216
71217
71218       function shortcutsModal(_modalSelection) {
71219           _modalSelection.select('.modal')
71220               .classed('modal-shortcuts', true);
71221
71222           var shortcutsModal = _modalSelection.select('.content');
71223
71224           shortcutsModal
71225               .append('div')
71226               .attr('class', 'modal-section')
71227               .append('h3')
71228               .text(t('shortcuts.title'));
71229
71230           shortcutsModal
71231               .call(render);
71232       }
71233
71234
71235       function render(selection) {
71236           var wrapper = selection
71237               .selectAll('.wrapper')
71238               .data([0]);
71239
71240           var wrapperEnter = wrapper
71241               .enter()
71242               .append('div')
71243               .attr('class', 'wrapper modal-section');
71244
71245           var tabsBar = wrapperEnter
71246               .append('div')
71247               .attr('class', 'tabs-bar');
71248
71249           var shortcutsList = wrapperEnter
71250               .append('div')
71251               .attr('class', 'shortcuts-list');
71252
71253           wrapper = wrapper.merge(wrapperEnter);
71254
71255           var tabs = tabsBar
71256               .selectAll('.tab')
71257               .data(dataShortcuts);
71258
71259           var tabsEnter = tabs
71260               .enter()
71261               .append('div')
71262               .attr('class', 'tab')
71263               .on('click', function (d, i) {
71264                   _activeTab = i;
71265                   render(selection);
71266               });
71267
71268           tabsEnter
71269               .append('span')
71270               .text(function (d) { return t(d.text); });
71271
71272           tabs = tabs
71273               .merge(tabsEnter);
71274
71275           // Update
71276           wrapper.selectAll('.tab')
71277               .classed('active', function (d, i) {
71278                   return i === _activeTab;
71279               });
71280
71281
71282           var shortcuts = shortcutsList
71283               .selectAll('.shortcut-tab')
71284               .data(dataShortcuts);
71285
71286           var shortcutsEnter = shortcuts
71287               .enter()
71288               .append('div')
71289               .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
71290
71291           var columnsEnter = shortcutsEnter
71292               .selectAll('.shortcut-column')
71293               .data(function (d) { return d.columns; })
71294               .enter()
71295               .append('table')
71296               .attr('class', 'shortcut-column');
71297
71298           var rowsEnter = columnsEnter
71299               .selectAll('.shortcut-row')
71300               .data(function (d) { return d.rows; })
71301               .enter()
71302               .append('tr')
71303               .attr('class', 'shortcut-row');
71304
71305
71306           var sectionRows = rowsEnter
71307               .filter(function (d) { return !d.shortcuts; });
71308
71309           sectionRows
71310               .append('td');
71311
71312           sectionRows
71313               .append('td')
71314               .attr('class', 'shortcut-section')
71315               .append('h3')
71316               .text(function (d) { return t(d.text); });
71317
71318
71319           var shortcutRows = rowsEnter
71320               .filter(function (d) { return d.shortcuts; });
71321
71322           var shortcutKeys = shortcutRows
71323               .append('td')
71324               .attr('class', 'shortcut-keys');
71325
71326           var modifierKeys = shortcutKeys
71327               .filter(function (d) { return d.modifiers; });
71328
71329           modifierKeys
71330               .selectAll('kbd.modifier')
71331               .data(function (d) {
71332                   if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
71333                       return ['⌘'];
71334                   } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
71335                       return [];
71336                   } else {
71337                       return d.modifiers;
71338                   }
71339               })
71340               .enter()
71341               .each(function () {
71342                   var selection = select(this);
71343
71344                   selection
71345                       .append('kbd')
71346                       .attr('class', 'modifier')
71347                       .text(function (d) { return uiCmd.display(d); });
71348
71349                   selection
71350                       .append('span')
71351                       .text('+');
71352               });
71353
71354
71355           shortcutKeys
71356               .selectAll('kbd.shortcut')
71357               .data(function (d) {
71358                   var arr = d.shortcuts;
71359                   if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
71360                       arr = ['Y'];
71361                   } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
71362                       arr = ['F11'];
71363                   }
71364
71365                   // replace translations
71366                   arr = arr.map(function(s) {
71367                       return uiCmd.display(s.indexOf('.') !== -1 ? t(s) : s);
71368                   });
71369
71370                   return uniq(arr).map(function(s) {
71371                       return {
71372                           shortcut: s,
71373                           separator: d.separator
71374                       };
71375                   });
71376               })
71377               .enter()
71378               .each(function (d, i, nodes) {
71379                   var selection = select(this);
71380                   var click = d.shortcut.toLowerCase().match(/(.*).click/);
71381
71382                   if (click && click[1]) {   // replace "left_click", "right_click" with mouse icon
71383                       selection
71384                           .call(svgIcon('#iD-walkthrough-mouse', 'mouseclick', click[1]));
71385                   } else {
71386                       selection
71387                           .append('kbd')
71388                           .attr('class', 'shortcut')
71389                           .text(function (d) { return d.shortcut; });
71390                   }
71391
71392                   if (i < nodes.length - 1) {
71393                       selection
71394                           .append('span')
71395                           .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
71396                   }
71397               });
71398
71399
71400           shortcutKeys
71401               .filter(function(d) { return d.gesture; })
71402               .each(function () {
71403                   var selection = select(this);
71404
71405                   selection
71406                       .append('span')
71407                       .text('+');
71408
71409                   selection
71410                       .append('span')
71411                       .attr('class', 'gesture')
71412                       .text(function (d) { return t(d.gesture); });
71413               });
71414
71415
71416           shortcutRows
71417               .append('td')
71418               .attr('class', 'shortcut-desc')
71419               .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
71420
71421
71422           shortcuts = shortcuts
71423               .merge(shortcutsEnter);
71424
71425           // Update
71426           wrapper.selectAll('.shortcut-tab')
71427               .style('display', function (d, i) {
71428                   return i === _activeTab ? 'flex' : 'none';
71429               });
71430       }
71431
71432
71433       return function(selection, show) {
71434           _selection = selection;
71435           if (show) {
71436               _modalSelection = uiModal(selection);
71437               shortcutsModal(_modalSelection);
71438           }
71439       };
71440   }
71441
71442   function uiHelp(context) {
71443       var key = t('help.key');
71444
71445       var _pane = select(null), _toggleButton = select(null);
71446
71447       var _shown = false;
71448
71449       var docKeys = [
71450           ['help', [
71451               'welcome',
71452               'open_data_h',
71453               'open_data',
71454               'before_start_h',
71455               'before_start',
71456               'open_source_h',
71457               'open_source',
71458               'open_source_help'
71459           ]],
71460           ['overview', [
71461               'navigation_h',
71462               'navigation_drag',
71463               'navigation_zoom',
71464               'features_h',
71465               'features',
71466               'nodes_ways'
71467           ]],
71468           ['editing', [
71469               'select_h',
71470               'select_left_click',
71471               'select_right_click',
71472               'multiselect_h',
71473               'multiselect_shift_click',
71474               'multiselect_lasso',
71475               'undo_redo_h',
71476               'undo_redo',
71477               'save_h',
71478               'save',
71479               'save_validation',
71480               'upload_h',
71481               'upload',
71482               'backups_h',
71483               'backups',
71484               'keyboard_h',
71485               'keyboard'
71486           ]],
71487           ['feature_editor', [
71488               'intro',
71489               'definitions',
71490               'type_h',
71491               'type',
71492               'type_picker',
71493               'fields_h',
71494               'fields_all_fields',
71495               'fields_example',
71496               'fields_add_field',
71497               'tags_h',
71498               'tags_all_tags',
71499               'tags_resources'
71500           ]],
71501           ['points', [
71502               'intro',
71503               'add_point_h',
71504               'add_point',
71505               'add_point_finish',
71506               'move_point_h',
71507               'move_point',
71508               'delete_point_h',
71509               'delete_point',
71510               'delete_point_command'
71511           ]],
71512           ['lines', [
71513               'intro',
71514               'add_line_h',
71515               'add_line',
71516               'add_line_draw',
71517               'add_line_finish',
71518               'modify_line_h',
71519               'modify_line_dragnode',
71520               'modify_line_addnode',
71521               'connect_line_h',
71522               'connect_line',
71523               'connect_line_display',
71524               'connect_line_drag',
71525               'connect_line_tag',
71526               'disconnect_line_h',
71527               'disconnect_line_command',
71528               'move_line_h',
71529               'move_line_command',
71530               'move_line_connected',
71531               'delete_line_h',
71532               'delete_line',
71533               'delete_line_command'
71534           ]],
71535           ['areas', [
71536               'intro',
71537               'point_or_area_h',
71538               'point_or_area',
71539               'add_area_h',
71540               'add_area_command',
71541               'add_area_draw',
71542               'add_area_finish',
71543               'square_area_h',
71544               'square_area_command',
71545               'modify_area_h',
71546               'modify_area_dragnode',
71547               'modify_area_addnode',
71548               'delete_area_h',
71549               'delete_area',
71550               'delete_area_command'
71551           ]],
71552           ['relations', [
71553               'intro',
71554               'edit_relation_h',
71555               'edit_relation',
71556               'edit_relation_add',
71557               'edit_relation_delete',
71558               'maintain_relation_h',
71559               'maintain_relation',
71560               'relation_types_h',
71561               'multipolygon_h',
71562               'multipolygon',
71563               'multipolygon_create',
71564               'multipolygon_merge',
71565               'turn_restriction_h',
71566               'turn_restriction',
71567               'turn_restriction_field',
71568               'turn_restriction_editing',
71569               'route_h',
71570               'route',
71571               'route_add',
71572               'boundary_h',
71573               'boundary',
71574               'boundary_add'
71575           ]],
71576           ['notes', [
71577               'intro',
71578               'add_note_h',
71579               'add_note',
71580               'move_note',
71581               'update_note_h',
71582               'update_note',
71583               'save_note_h',
71584               'save_note'
71585           ]],
71586
71587           ['imagery', [
71588               'intro',
71589               'sources_h',
71590               'choosing',
71591               'sources',
71592               'offsets_h',
71593               'offset',
71594               'offset_change'
71595           ]],
71596           ['streetlevel', [
71597               'intro',
71598               'using_h',
71599               'using',
71600               'photos',
71601               'viewer'
71602           ]],
71603           ['gps', [
71604               'intro',
71605               'survey',
71606               'using_h',
71607               'using',
71608               'tracing',
71609               'upload'
71610           ]],
71611           ['qa', [
71612               'intro',
71613               'tools_h',
71614               'tools',
71615               'issues_h',
71616               'issues'
71617           ]]
71618       ];
71619
71620       var headings = {
71621           'help.help.open_data_h': 3,
71622           'help.help.before_start_h': 3,
71623           'help.help.open_source_h': 3,
71624           'help.overview.navigation_h': 3,
71625           'help.overview.features_h': 3,
71626           'help.editing.select_h': 3,
71627           'help.editing.multiselect_h': 3,
71628           'help.editing.undo_redo_h': 3,
71629           'help.editing.save_h': 3,
71630           'help.editing.upload_h': 3,
71631           'help.editing.backups_h': 3,
71632           'help.editing.keyboard_h': 3,
71633           'help.feature_editor.type_h': 3,
71634           'help.feature_editor.fields_h': 3,
71635           'help.feature_editor.tags_h': 3,
71636           'help.points.add_point_h': 3,
71637           'help.points.move_point_h': 3,
71638           'help.points.delete_point_h': 3,
71639           'help.lines.add_line_h': 3,
71640           'help.lines.modify_line_h': 3,
71641           'help.lines.connect_line_h': 3,
71642           'help.lines.disconnect_line_h': 3,
71643           'help.lines.move_line_h': 3,
71644           'help.lines.delete_line_h': 3,
71645           'help.areas.point_or_area_h': 3,
71646           'help.areas.add_area_h': 3,
71647           'help.areas.square_area_h': 3,
71648           'help.areas.modify_area_h': 3,
71649           'help.areas.delete_area_h': 3,
71650           'help.relations.edit_relation_h': 3,
71651           'help.relations.maintain_relation_h': 3,
71652           'help.relations.relation_types_h': 2,
71653           'help.relations.multipolygon_h': 3,
71654           'help.relations.turn_restriction_h': 3,
71655           'help.relations.route_h': 3,
71656           'help.relations.boundary_h': 3,
71657           'help.notes.add_note_h': 3,
71658           'help.notes.update_note_h': 3,
71659           'help.notes.save_note_h': 3,
71660           'help.imagery.sources_h': 3,
71661           'help.imagery.offsets_h': 3,
71662           'help.streetlevel.using_h': 3,
71663           'help.gps.using_h': 3,
71664           'help.qa.tools_h': 3,
71665           'help.qa.issues_h': 3
71666       };
71667
71668       var replacements = {
71669           point: icon('#iD-icon-point', 'pre-text'),
71670           line: icon('#iD-icon-line', 'pre-text'),
71671           area: icon('#iD-icon-area', 'pre-text'),
71672           note: icon('#iD-icon-note', 'pre-text add-note'),
71673           plus: icon('#iD-icon-plus', 'pre-text'),
71674           minus: icon('#iD-icon-minus', 'pre-text'),
71675           orthogonalize: icon('#iD-operation-orthogonalize', 'pre-text'),
71676           disconnect: icon('#iD-operation-disconnect', 'pre-text'),
71677           layers: icon('#iD-icon-layers', 'pre-text'),
71678           data: icon('#iD-icon-data', 'pre-text'),
71679           inspect: icon('#iD-icon-inspect', 'pre-text'),
71680           move: icon('#iD-operation-move', 'pre-text'),
71681           merge: icon('#iD-operation-merge', 'pre-text'),
71682           delete: icon('#iD-operation-delete', 'pre-text'),
71683           close: icon('#iD-icon-close', 'pre-text'),
71684           undo: icon(textDirection === 'rtl' ? '#iD-icon-redo' : '#iD-icon-undo', 'pre-text'),
71685           redo: icon(textDirection === 'rtl' ? '#iD-icon-undo' : '#iD-icon-redo', 'pre-text'),
71686           save: icon('#iD-icon-save', 'pre-text'),
71687           leftclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'left'),
71688           rightclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'right'),
71689           shift: uiCmd.display('⇧'),
71690           alt: uiCmd.display('⌥'),
71691           return: uiCmd.display('↵'),
71692           version: context.version
71693       };
71694
71695       // For each section, squash all the texts into a single markdown document
71696       var docs = docKeys.map(function(key) {
71697           var helpkey = 'help.' + key[0];
71698           var text = key[1].reduce(function(all, part) {
71699               var subkey = helpkey + '.' + part;
71700               var depth = headings[subkey];                              // is this subkey a heading?
71701               var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
71702               return all + hhh + t(subkey, replacements) + '\n\n';
71703           }, '');
71704
71705           return {
71706               title: t(helpkey + '.title'),
71707               html: marked(text.trim())
71708           };
71709       });
71710
71711       var paneTooltip = tooltip()
71712           .placement((textDirection === 'rtl') ? 'right' : 'left')
71713           .html(true)
71714           .title(uiTooltipHtml(t('help.title'), key));
71715
71716       uiHelp.hidePane = function() {
71717           uiHelp.setVisible(false);
71718       };
71719
71720       uiHelp.togglePane = function() {
71721           if (event) event.preventDefault();
71722           paneTooltip.hide(_toggleButton);
71723           uiHelp.setVisible(!_toggleButton.classed('active'));
71724       };
71725
71726       uiHelp.setVisible = function(show) {
71727           if (show !== _shown) {
71728               _toggleButton.classed('active', show);
71729               _shown = show;
71730
71731               if (show) {
71732                   uiBackground.hidePane();
71733                   uiIssues.hidePane();
71734                   uiMapData.hidePane();
71735
71736                   _pane.style('display', 'block')
71737                       .style('right', '-500px')
71738                       .transition()
71739                       .duration(200)
71740                       .style('right', '0px');
71741
71742               } else {
71743                   _pane.style('right', '0px')
71744                       .transition()
71745                       .duration(200)
71746                       .style('right', '-500px')
71747                       .on('end', function() {
71748                           select(this).style('display', 'none');
71749                       });
71750               }
71751           }
71752       };
71753
71754       uiHelp.renderToggleButton = function(selection) {
71755
71756           _toggleButton = selection.append('button')
71757               .attr('tabindex', -1)
71758               .on('click', uiHelp.togglePane)
71759               .call(svgIcon('#iD-icon-help', 'light'))
71760               .call(paneTooltip);
71761       };
71762
71763
71764       uiHelp.renderPane = function(selection) {
71765
71766           function clickHelp(d, i) {
71767               var rtl = (textDirection === 'rtl');
71768               content.property('scrollTop', 0);
71769               doctitle.html(d.title);
71770
71771               body.html(d.html);
71772               body.selectAll('a')
71773                   .attr('target', '_blank');
71774               menuItems.classed('selected', function(m) {
71775                   return m.title === d.title;
71776               });
71777
71778               nav.html('');
71779               if (rtl) {
71780                   nav.call(drawNext).call(drawPrevious);
71781               } else {
71782                   nav.call(drawPrevious).call(drawNext);
71783               }
71784
71785
71786               function drawNext(selection) {
71787                   if (i < docs.length - 1) {
71788                       var nextLink = selection
71789                           .append('a')
71790                           .attr('class', 'next')
71791                           .on('click', function() {
71792                               clickHelp(docs[i + 1], i + 1);
71793                           });
71794
71795                       nextLink
71796                           .append('span')
71797                           .text(docs[i + 1].title)
71798                           .call(svgIcon((rtl ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
71799                   }
71800               }
71801
71802
71803               function drawPrevious(selection) {
71804                   if (i > 0) {
71805                       var prevLink = selection
71806                           .append('a')
71807                           .attr('class', 'previous')
71808                           .on('click', function() {
71809                               clickHelp(docs[i - 1], i - 1);
71810                           });
71811
71812                       prevLink
71813                           .call(svgIcon((rtl ? '#iD-icon-forward' : '#iD-icon-backward'), 'inline'))
71814                           .append('span')
71815                           .text(docs[i - 1].title);
71816                   }
71817               }
71818           }
71819
71820
71821           function clickWalkthrough() {
71822               if (context.inIntro()) return;
71823               context.container().call(uiIntro(context));
71824               uiHelp.setVisible(false);
71825           }
71826
71827
71828           function clickShortcuts() {
71829               context.container().call(uiShortcuts(context), true);
71830           }
71831
71832
71833           _pane = selection.append('div')
71834               .attr('class', 'help-wrap map-pane fillL hide');
71835
71836           var heading = _pane
71837               .append('div')
71838               .attr('class', 'pane-heading');
71839
71840           var doctitle = heading
71841               .append('h2')
71842               .text(t('help.title'));
71843
71844           heading
71845               .append('button')
71846               .on('click', uiHelp.hidePane)
71847               .call(svgIcon('#iD-icon-close'));
71848
71849
71850           var content = _pane
71851               .append('div')
71852               .attr('class', 'pane-content');
71853
71854           var toc = content
71855               .append('ul')
71856               .attr('class', 'toc');
71857
71858           var menuItems = toc.selectAll('li')
71859               .data(docs)
71860               .enter()
71861               .append('li')
71862               .append('a')
71863               .html(function(d) { return d.title; })
71864               .on('click', clickHelp);
71865
71866           var shortcuts = toc
71867               .append('li')
71868               .attr('class', 'shortcuts')
71869               .call(tooltip()
71870                   .html(true)
71871                   .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
71872                   .placement('top')
71873               )
71874               .append('a')
71875               .on('click', clickShortcuts);
71876
71877           shortcuts
71878               .append('div')
71879               .text(t('shortcuts.title'));
71880
71881           var walkthrough = toc
71882               .append('li')
71883               .attr('class', 'walkthrough')
71884               .append('a')
71885               .on('click', clickWalkthrough);
71886
71887           walkthrough
71888               .append('svg')
71889               .attr('class', 'logo logo-walkthrough')
71890               .append('use')
71891               .attr('xlink:href', '#iD-logo-walkthrough');
71892
71893           walkthrough
71894               .append('div')
71895               .text(t('splash.walkthrough'));
71896
71897
71898           var helpContent = content
71899               .append('div')
71900               .attr('class', 'left-content');
71901
71902           var body = helpContent
71903               .append('div')
71904               .attr('class', 'body');
71905
71906           var nav = helpContent
71907               .append('div')
71908               .attr('class', 'nav');
71909
71910           clickHelp(docs[0], 0);
71911
71912           context.keybinding()
71913               .on(key, uiHelp.togglePane);
71914
71915       };
71916
71917       return uiHelp;
71918   }
71919
71920   function localeDateString(s) {
71921       if (!s) return null;
71922       var detected = utilDetect();
71923       var options = { day: 'numeric', month: 'short', year: 'numeric' };
71924       var d = new Date(s);
71925       if (isNaN(d.getTime())) return null;
71926       return d.toLocaleDateString(detected.locale, options);
71927   }
71928
71929   function vintageRange(vintage) {
71930       var s;
71931       if (vintage.start || vintage.end) {
71932           s = (vintage.start || '?');
71933           if (vintage.start !== vintage.end) {
71934               s += ' - ' + (vintage.end || '?');
71935           }
71936       }
71937       return s;
71938   }
71939
71940
71941   function rendererBackgroundSource(data) {
71942       var source = clone(data);
71943       var offset = [0, 0];
71944       var name = source.name;
71945       var description = source.description;
71946       var best = !!source.best;
71947       var template = source.template;
71948
71949       source.tileSize = data.tileSize || 256;
71950       source.zoomExtent = data.zoomExtent || [0, 22];
71951       source.overzoom = data.overzoom !== false;
71952
71953       source.offset = function(_) {
71954           if (!arguments.length) return offset;
71955           offset = _;
71956           return source;
71957       };
71958
71959
71960       source.nudge = function(_, zoomlevel) {
71961           offset[0] += _[0] / Math.pow(2, zoomlevel);
71962           offset[1] += _[1] / Math.pow(2, zoomlevel);
71963           return source;
71964       };
71965
71966
71967       source.name = function() {
71968           var id_safe = source.id.replace(/\./g, '<TX_DOT>');
71969           return t('imagery.' + id_safe + '.name', { default: name });
71970       };
71971
71972
71973       source.description = function() {
71974           var id_safe = source.id.replace(/\./g, '<TX_DOT>');
71975           return t('imagery.' + id_safe + '.description', { default: description });
71976       };
71977
71978
71979       source.best = function() {
71980           return best;
71981       };
71982
71983
71984       source.area = function() {
71985           if (!data.polygon) return Number.MAX_VALUE;  // worldwide
71986           var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
71987           return isNaN(area) ? 0 : area;
71988       };
71989
71990
71991       source.imageryUsed = function() {
71992           return name || source.id;
71993       };
71994
71995
71996       source.template = function(_) {
71997           if (!arguments.length) return template;
71998           if (source.id === 'custom') template = _;
71999           return source;
72000       };
72001
72002
72003       source.url = function(coord) {
72004           if (this.type === 'wms') {
72005               var tileToProjectedCoords = (function(x, y, z) {
72006                   //polyfill for IE11, PhantomJS
72007                   var sinh = Math.sinh || function(x) {
72008                       var y = Math.exp(x);
72009                       return (y - 1 / y) / 2;
72010                   };
72011
72012                   var zoomSize = Math.pow(2, z);
72013                   var lon = x / zoomSize * Math.PI * 2 - Math.PI;
72014                   var lat = Math.atan(sinh(Math.PI * (1 - 2 * y / zoomSize)));
72015
72016                   switch (this.projection) {
72017                       case 'EPSG:4326':
72018                           return {
72019                               x: lon * 180 / Math.PI,
72020                               y: lat * 180 / Math.PI
72021                           };
72022                       default: // EPSG:3857 and synonyms
72023                           var mercCoords = mercatorRaw(lon, lat);
72024                           return {
72025                               x: 20037508.34 / Math.PI * mercCoords[0],
72026                               y: 20037508.34 / Math.PI * mercCoords[1]
72027                           };
72028                   }
72029               }).bind(this);
72030
72031               var tileSize = this.tileSize;
72032               var projection = this.projection;
72033               var minXmaxY = tileToProjectedCoords(coord[0], coord[1], coord[2]);
72034               var maxXminY = tileToProjectedCoords(coord[0]+1, coord[1]+1, coord[2]);
72035               return template.replace(/\{(\w+)\}/g, function (token, key) {
72036                 switch (key) {
72037                   case 'width':
72038                   case 'height':
72039                     return tileSize;
72040                   case 'proj':
72041                     return projection;
72042                   case 'wkid':
72043                     return projection.replace(/^EPSG:/, '');
72044                   case 'bbox':
72045                     return minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y;
72046                   case 'w':
72047                     return minXmaxY.x;
72048                   case 's':
72049                     return maxXminY.y;
72050                   case 'n':
72051                     return maxXminY.x;
72052                   case 'e':
72053                     return minXmaxY.y;
72054                   default:
72055                     return token;
72056                 }
72057               });
72058           }
72059           return template
72060               .replace('{x}', coord[0])
72061               .replace('{y}', coord[1])
72062               // TMS-flipped y coordinate
72063               .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
72064               .replace(/\{z(oom)?\}/, coord[2])
72065               .replace(/\{switch:([^}]+)\}/, function(s, r) {
72066                   var subdomains = r.split(',');
72067                   return subdomains[(coord[0] + coord[1]) % subdomains.length];
72068               })
72069               .replace('{u}', function() {
72070                   var u = '';
72071                   for (var zoom = coord[2]; zoom > 0; zoom--) {
72072                       var b = 0;
72073                       var mask = 1 << (zoom - 1);
72074                       if ((coord[0] & mask) !== 0) b++;
72075                       if ((coord[1] & mask) !== 0) b += 2;
72076                       u += b.toString();
72077                   }
72078                   return u;
72079               });
72080       };
72081
72082
72083       source.validZoom = function(z) {
72084           return source.zoomExtent[0] <= z &&
72085               (source.overzoom || source.zoomExtent[1] > z);
72086       };
72087
72088
72089       source.isLocatorOverlay = function() {
72090           return source.id === 'mapbox_locator_overlay';
72091       };
72092
72093
72094       /* hides a source from the list, but leaves it available for use */
72095       source.isHidden = function() {
72096           return source.id === 'DigitalGlobe-Premium-vintage' ||
72097               source.id === 'DigitalGlobe-Standard-vintage';
72098       };
72099
72100
72101       source.copyrightNotices = function() {};
72102
72103
72104       source.getMetadata = function(center, tileCoord, callback) {
72105           var vintage = {
72106               start: localeDateString(source.startDate),
72107               end: localeDateString(source.endDate)
72108           };
72109           vintage.range = vintageRange(vintage);
72110
72111           var metadata = { vintage: vintage };
72112           callback(null, metadata);
72113       };
72114
72115
72116       return source;
72117   }
72118
72119
72120   rendererBackgroundSource.Bing = function(data, dispatch) {
72121       // http://msdn.microsoft.com/en-us/library/ff701716.aspx
72122       // http://msdn.microsoft.com/en-us/library/ff701701.aspx
72123
72124       data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
72125
72126       var bing = rendererBackgroundSource(data);
72127       var key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU'; // Same as P2 and JOSM
72128       var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' +
72129               key;
72130       var cache = {};
72131       var inflight = {};
72132       var providers = [];
72133
72134       d3_json(url, function(err, json) {
72135           providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
72136               return {
72137                   attribution: provider.attribution,
72138                   areas: provider.coverageAreas.map(function(area) {
72139                       return {
72140                           zoom: [area.zoomMin, area.zoomMax],
72141                           extent: geoExtent([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
72142                       };
72143                   })
72144               };
72145           });
72146           dispatch.call('change');
72147       });
72148
72149
72150       bing.copyrightNotices = function(zoom, extent) {
72151           zoom = Math.min(zoom, 21);
72152           return providers.filter(function(provider) {
72153               return some(provider.areas, function(area) {
72154                   return extent.intersects(area.extent) &&
72155                       area.zoom[0] <= zoom &&
72156                       area.zoom[1] >= zoom;
72157               });
72158           }).map(function(provider) {
72159               return provider.attribution;
72160           }).join(', ');
72161       };
72162
72163
72164       bing.getMetadata = function(center, tileCoord, callback) {
72165           var tileId = tileCoord.slice(0, 3).join('/');
72166           var zoom = Math.min(tileCoord[2], 21);
72167           var centerPoint = center[1] + ',' + center[0];  // lat,lng
72168           var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
72169                   '?zl=' + zoom + '&key=' + key;
72170
72171           if (inflight[tileId]) return;
72172
72173           if (!cache[tileId]) {
72174               cache[tileId] = {};
72175           }
72176           if (cache[tileId] && cache[tileId].metadata) {
72177               return callback(null, cache[tileId].metadata);
72178           }
72179
72180           inflight[tileId] = true;
72181           d3_json(url, function(error, result) {
72182               delete inflight[tileId];
72183
72184               var err;
72185               if (error) {
72186                   err = error;
72187               } else if (!result && 'Unknown Error') {
72188                   err = result.errorDetails;
72189               }
72190               if (err) {
72191                   return callback(err);
72192               } else {
72193                   var vintage = {
72194                       start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
72195                       end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
72196                   };
72197                   vintage.range = vintageRange(vintage);
72198
72199                   var metadata = { vintage: vintage };
72200                   cache[tileId].metadata = metadata;
72201                   return callback(null, metadata);
72202               }
72203           });
72204       };
72205
72206
72207       bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
72208
72209
72210       return bing;
72211   };
72212
72213
72214
72215   rendererBackgroundSource.Esri = function(data) {
72216       // in addition to using the tilemap at zoom level 20, overzoom real tiles - #4327 (deprecated technique, but it works)
72217       if (data.template.match(/blankTile/) === null) {
72218           data.template = data.template + '?blankTile=false';
72219       }
72220
72221       var esri = rendererBackgroundSource(data);
72222       var cache = {};
72223       var inflight = {};
72224       var _prevCenter;
72225
72226       // use a tilemap service to set maximum zoom for esri tiles dynamically
72227       // https://developers.arcgis.com/documentation/tiled-elevation-service/
72228       esri.fetchTilemap = function(center) {
72229           // skip if we have already fetched a tilemap within 5km
72230           if (_prevCenter && geoSphericalDistance(center, _prevCenter) < 5000) return;
72231           _prevCenter = center;
72232
72233           // tiles are available globally to zoom level 19, afterward they may or may not be present
72234           var z = 20;
72235
72236           // first generate a random url using the template
72237           var dummyUrl = esri.url([1,2,3]);
72238
72239           // calculate url z/y/x from the lat/long of the center of the map
72240           var x = (Math.floor((center[0] + 180) / 360 * Math.pow(2, z)));
72241           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)));
72242
72243           // fetch an 8x8 grid to leverage cache
72244           var tilemapUrl = dummyUrl.replace(/tile\/[0-9]+\/[0-9]+\/[0-9]+\?blankTile=false/, 'tilemap') + '/' + z + '/' + y + '/' + x + '/8/8';
72245
72246           // make the request and introspect the response from the tilemap server
72247           d3_json(tilemapUrl, function (err, tilemap) {
72248               if (err || !tilemap) return;
72249
72250               var hasTiles = true;
72251               for (var i = 0; i < tilemap.data.length; i++) {
72252                   // 0 means an individual tile in the grid doesn't exist
72253                   if (!tilemap.data[i]) {
72254                       hasTiles = false;
72255                       break;
72256                   }
72257               }
72258
72259               // if any tiles are missing at level 20 we restrict maxZoom to 19
72260               esri.zoomExtent[1] = (hasTiles ? 22 : 19);
72261           });
72262       };
72263
72264       esri.getMetadata = function(center, tileCoord, callback) {
72265           var tileId = tileCoord.slice(0, 3).join('/');
72266           var zoom = Math.min(tileCoord[2], esri.zoomExtent[1]);
72267           var centerPoint = center[0] + ',' + center[1];  // long, lat (as it should be)
72268           var unknown = t('info_panels.background.unknown');
72269           var metadataLayer;
72270           var vintage = {};
72271           var metadata = {};
72272
72273           if (inflight[tileId]) return;
72274
72275           switch (true) {
72276               case (zoom >= 20 && esri.id === 'EsriWorldImageryClarity'):
72277                   metadataLayer = 4;
72278                   break;
72279               case zoom >= 19:
72280                   metadataLayer = 3;
72281                   break;
72282               case zoom >= 17:
72283                   metadataLayer = 2;
72284                   break;
72285               case zoom >= 13:
72286                   metadataLayer = 0;
72287                   break;
72288               default:
72289                   metadataLayer = 99;
72290           }
72291
72292           var url;
72293           // build up query using the layer appropriate to the current zoom
72294           if (esri.id === 'EsriWorldImagery') {
72295               url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/';
72296           } else if (esri.id === 'EsriWorldImageryClarity') {
72297               url = 'https://serviceslab.arcgisonline.com/arcgis/rest/services/Clarity_World_Imagery/MapServer/';
72298           }
72299
72300           url += metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json';
72301
72302           if (!cache[tileId]) {
72303               cache[tileId] = {};
72304           }
72305           if (cache[tileId] && cache[tileId].metadata) {
72306               return callback(null, cache[tileId].metadata);
72307           }
72308
72309           // accurate metadata is only available >= 13
72310           if (metadataLayer === 99) {
72311               vintage = {
72312                   start: null,
72313                   end: null,
72314                   range: null
72315               };
72316               metadata = {
72317                   vintage: null,
72318                   source: unknown,
72319                   description: unknown,
72320                   resolution: unknown,
72321                   accuracy: unknown
72322               };
72323
72324               callback(null, metadata);
72325
72326           } else {
72327               inflight[tileId] = true;
72328               d3_json(url, function(error, result) {
72329                   delete inflight[tileId];
72330
72331                   var err;
72332                   if (error) {
72333                       err = error;
72334                   } else if (!result) {
72335                       err = 'Unknown Error';
72336                   } else if (result.features && result.features.length < 1) {
72337                       err = 'No Results';
72338                   } else if (result.error && result.error.message) {
72339                       err = result.error.message;
72340                   }
72341
72342                   if (err) {
72343                       return callback(err);
72344                   } else {
72345                       // pass through the discrete capture date from metadata
72346                       var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
72347                       vintage = {
72348                           start: captureDate,
72349                           end: captureDate,
72350                           range: captureDate
72351                       };
72352                       metadata = {
72353                           vintage: vintage,
72354                           source: clean(result.features[0].attributes.NICE_NAME),
72355                           description: clean(result.features[0].attributes.NICE_DESC),
72356                           resolution: clean(result.features[0].attributes.SRC_RES),
72357                           accuracy: clean(result.features[0].attributes.SRC_ACC)
72358                       };
72359
72360                       // append units - meters
72361                       if (isFinite(metadata.resolution)) {
72362                           metadata.resolution += ' m';
72363                       }
72364                       if (isFinite(metadata.accuracy)) {
72365                           metadata.accuracy += ' m';
72366                       }
72367
72368                       cache[tileId].metadata = metadata;
72369                       return callback(null, metadata);
72370                   }
72371               });
72372           }
72373
72374
72375           function clean(val) {
72376               return String(val).trim() || unknown;
72377           }
72378       };
72379
72380       return esri;
72381   };
72382
72383
72384   rendererBackgroundSource.None = function() {
72385       var source = rendererBackgroundSource({ id: 'none', template: '' });
72386
72387
72388       source.name = function() {
72389           return t('background.none');
72390       };
72391
72392
72393       source.imageryUsed = function() {
72394           return null;
72395       };
72396
72397
72398       source.area = function() {
72399           return -1;  // sources in background pane are sorted by area
72400       };
72401
72402
72403       return source;
72404   };
72405
72406
72407   rendererBackgroundSource.Custom = function(template) {
72408       var source = rendererBackgroundSource({ id: 'custom', template: template });
72409
72410
72411       source.name = function() {
72412           return t('background.custom');
72413       };
72414
72415
72416       source.imageryUsed = function() {
72417           return 'Custom (' + source.template() + ')';
72418       };
72419
72420
72421       source.area = function() {
72422           return -2;  // sources in background pane are sorted by area
72423       };
72424
72425
72426       return source;
72427   };
72428
72429   function rendererTileLayer(context) {
72430       var transformProp = utilPrefixCSSProperty('Transform');
72431       var tiler = utilTiler();
72432
72433       var _tileSize = 256;
72434       var _projection;
72435       var _cache = {};
72436       var _tileOrigin;
72437       var _zoom;
72438       var _source;
72439
72440
72441       function tileSizeAtZoom(d, z) {
72442           var EPSILON = 0.002;    // close seams
72443           return ((_tileSize * Math.pow(2, z - d[2])) / _tileSize) + EPSILON;
72444       }
72445
72446
72447       function atZoom(t, distance) {
72448           var power = Math.pow(2, distance);
72449           return [
72450               Math.floor(t[0] * power),
72451               Math.floor(t[1] * power),
72452               t[2] + distance
72453           ];
72454       }
72455
72456
72457       function lookUp(d) {
72458           for (var up = -1; up > -d[2]; up--) {
72459               var tile = atZoom(d, up);
72460               if (_cache[_source.url(tile)] !== false) {
72461                   return tile;
72462               }
72463           }
72464       }
72465
72466
72467       function uniqueBy(a, n) {
72468           var o = [];
72469           var seen = {};
72470           for (var i = 0; i < a.length; i++) {
72471               if (seen[a[i][n]] === undefined) {
72472                   o.push(a[i]);
72473                   seen[a[i][n]] = true;
72474               }
72475           }
72476           return o;
72477       }
72478
72479
72480       function addSource(d) {
72481           d.push(_source.url(d));
72482           return d;
72483       }
72484
72485
72486       // Update tiles based on current state of `projection`.
72487       function background(selection) {
72488           _zoom = geoScaleToZoom(_projection.scale(), _tileSize);
72489
72490           var pixelOffset;
72491           if (_source) {
72492               pixelOffset = [
72493                   _source.offset()[0] * Math.pow(2, _zoom),
72494                   _source.offset()[1] * Math.pow(2, _zoom)
72495               ];
72496           } else {
72497               pixelOffset = [0, 0];
72498           }
72499
72500           var translate = [
72501               _projection.translate()[0] + pixelOffset[0],
72502               _projection.translate()[1] + pixelOffset[1]
72503           ];
72504
72505           tiler
72506               .scale(_projection.scale() * 2 * Math.PI)
72507               .translate(translate);
72508
72509           _tileOrigin = [
72510               _projection.scale() * Math.PI - translate[0],
72511               _projection.scale() * Math.PI - translate[1]
72512           ];
72513
72514           render(selection);
72515       }
72516
72517
72518       // Derive the tiles onscreen, remove those offscreen and position them.
72519       // Important that this part not depend on `_projection` because it's
72520       // rentered when tiles load/error (see #644).
72521       function render(selection) {
72522           if (!_source) return;
72523           var requests = [];
72524           var showDebug = context.getDebug('tile') && !_source.overlay;
72525
72526           if (_source.validZoom(_zoom)) {
72527               tiler.skipNullIsland(!!_source.overlay);
72528
72529               tiler().forEach(function(d) {
72530                   addSource(d);
72531                   if (d[3] === '') return;
72532                   if (typeof d[3] !== 'string') return; // Workaround for #2295
72533                   requests.push(d);
72534                   if (_cache[d[3]] === false && lookUp(d)) {
72535                       requests.push(addSource(lookUp(d)));
72536                   }
72537               });
72538
72539               requests = uniqueBy(requests, 3).filter(function(r) {
72540                   // don't re-request tiles which have failed in the past
72541                   return _cache[r[3]] !== false;
72542               });
72543           }
72544
72545           function load(d) {
72546               _cache[d[3]] = true;
72547               select(this)
72548                   .on('error', null)
72549                   .on('load', null)
72550                   .classed('tile-loaded', true);
72551               render(selection);
72552           }
72553
72554           function error(d) {
72555               _cache[d[3]] = false;
72556               select(this)
72557                   .on('error', null)
72558                   .on('load', null)
72559                   .remove();
72560               render(selection);
72561           }
72562
72563           function imageTransform(d) {
72564               var ts = _tileSize * Math.pow(2, _zoom - d[2]);
72565               var scale = tileSizeAtZoom(d, _zoom);
72566               return 'translate(' +
72567                   ((d[0] * ts) - _tileOrigin[0]) + 'px,' +
72568                   ((d[1] * ts) - _tileOrigin[1]) + 'px) ' +
72569                   'scale(' + scale + ',' + scale + ')';
72570           }
72571
72572           function tileCenter(d) {
72573               var ts = _tileSize * Math.pow(2, _zoom - d[2]);
72574               return [
72575                   ((d[0] * ts) - _tileOrigin[0] + (ts / 2)),
72576                   ((d[1] * ts) - _tileOrigin[1] + (ts / 2))
72577               ];
72578           }
72579
72580           function debugTransform(d) {
72581               var coord = tileCenter(d);
72582               return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
72583           }
72584
72585
72586           // Pick a representative tile near the center of the viewport
72587           // (This is useful for sampling the imagery vintage)
72588           var dims = tiler.size();
72589           var mapCenter = [dims[0] / 2, dims[1] / 2];
72590           var minDist = Math.max(dims[0], dims[1]);
72591           var nearCenter;
72592
72593           requests.forEach(function(d) {
72594               var c = tileCenter(d);
72595               var dist = geoVecLength(c, mapCenter);
72596               if (dist < minDist) {
72597                   minDist = dist;
72598                   nearCenter = d;
72599               }
72600           });
72601
72602
72603           var image = selection.selectAll('img')
72604               .data(requests, function(d) { return d[3]; });
72605
72606           image.exit()
72607               .style(transformProp, imageTransform)
72608               .classed('tile-removing', true)
72609               .classed('tile-center', false)
72610               .each(function() {
72611                   var tile = select(this);
72612                   window.setTimeout(function() {
72613                       if (tile.classed('tile-removing')) {
72614                           tile.remove();
72615                       }
72616                   }, 300);
72617               });
72618
72619           image.enter()
72620             .append('img')
72621               .attr('class', 'tile')
72622               .attr('src', function(d) { return d[3]; })
72623               .on('error', error)
72624               .on('load', load)
72625             .merge(image)
72626               .style(transformProp, imageTransform)
72627               .classed('tile-debug', showDebug)
72628               .classed('tile-removing', false)
72629               .classed('tile-center', function(d) { return d === nearCenter; });
72630
72631
72632
72633           var debug = selection.selectAll('.tile-label-debug')
72634               .data(showDebug ? requests : [], function(d) { return d[3]; });
72635
72636           debug.exit()
72637               .remove();
72638
72639           if (showDebug) {
72640               var debugEnter = debug.enter()
72641                   .append('div')
72642                   .attr('class', 'tile-label-debug');
72643
72644               debugEnter
72645                   .append('div')
72646                   .attr('class', 'tile-label-debug-coord');
72647
72648               debugEnter
72649                   .append('div')
72650                   .attr('class', 'tile-label-debug-vintage');
72651
72652               debug = debug.merge(debugEnter);
72653
72654               debug
72655                   .style(transformProp, debugTransform);
72656
72657               debug
72658                   .selectAll('.tile-label-debug-coord')
72659                   .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
72660
72661               debug
72662                   .selectAll('.tile-label-debug-vintage')
72663                   .each(function(d) {
72664                       var span = select(this);
72665                       var center = context.projection.invert(tileCenter(d));
72666                       _source.getMetadata(center, d, function(err, result) {
72667                           span.text((result && result.vintage && result.vintage.range) ||
72668                               t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
72669                           );
72670                       });
72671                   });
72672           }
72673
72674       }
72675
72676
72677       background.projection = function(_) {
72678           if (!arguments.length) return _projection;
72679           _projection = _;
72680           return background;
72681       };
72682
72683
72684       background.dimensions = function(_) {
72685           if (!arguments.length) return tiler.size();
72686           tiler.size(_);
72687           return background;
72688       };
72689
72690
72691       background.source = function(_) {
72692           if (!arguments.length) return _source;
72693           _source = _;
72694           _tileSize = _source.tileSize;
72695           _cache = {};
72696           tiler.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent);
72697           return background;
72698       };
72699
72700
72701       return background;
72702   }
72703
72704   function rendererBackground(context) {
72705       var dispatch$1 = dispatch('change');
72706       var detected = utilDetect();
72707       var baseLayer = rendererTileLayer(context).projection(context.projection);
72708       var _isValid = true;
72709       var _overlayLayers = [];
72710       var _backgroundSources = [];
72711       var _brightness = 1;
72712       var _contrast = 1;
72713       var _saturation = 1;
72714       var _sharpness = 1;
72715
72716
72717       function background(selection) {
72718           // If we are displaying an Esri basemap at high zoom,
72719           // check its tilemap to see how high the zoom can go
72720           if (context.map().zoom() > 18) {
72721               var basemap = baseLayer.source();
72722               if (basemap && /^EsriWorldImagery/.test(basemap.id)) {
72723                   var center = context.map().center();
72724                   basemap.fetchTilemap(center);
72725               }
72726           }
72727
72728           // Is the imagery valid here? - #4827
72729           var sources = background.sources(context.map().extent());
72730           var wasValid = _isValid;
72731           _isValid = !!sources
72732               .filter(function(d) { return d === baseLayer.source(); }).length;
72733
72734           if (wasValid !== _isValid) {      // change in valid status
72735               background.updateImagery();
72736           }
72737
72738
72739           var baseFilter = '';
72740           if (detected.cssfilters) {
72741               if (_brightness !== 1) {
72742                   baseFilter += 'brightness(' + _brightness + ')';
72743               }
72744               if (_contrast !== 1) {
72745                   baseFilter += 'contrast(' + _contrast + ')';
72746               }
72747               if (_saturation !== 1) {
72748                   baseFilter += 'saturate(' + _saturation + ')';
72749               }
72750               if (_sharpness < 1) {  // gaussian blur
72751                   var blur = interpolateNumber(0.5, 5)(1 - _sharpness);
72752                   baseFilter += 'blur(' + blur + 'px)';
72753               }
72754           }
72755
72756           var base = selection.selectAll('.layer-background')
72757               .data([0]);
72758
72759           base = base.enter()
72760               .insert('div', '.layer-data')
72761               .attr('class', 'layer layer-background')
72762               .merge(base);
72763
72764           if (detected.cssfilters) {
72765               base.style('filter', baseFilter || null);
72766           } else {
72767               base.style('opacity', _brightness);
72768           }
72769
72770
72771           var imagery = base.selectAll('.layer-imagery')
72772               .data([0]);
72773
72774           imagery.enter()
72775               .append('div')
72776               .attr('class', 'layer layer-imagery')
72777               .merge(imagery)
72778               .call(baseLayer);
72779
72780
72781           var maskFilter = '';
72782           var mixBlendMode = '';
72783           if (detected.cssfilters && _sharpness > 1) {  // apply unsharp mask
72784               mixBlendMode = 'overlay';
72785               maskFilter = 'saturate(0) blur(3px) invert(1)';
72786
72787               var contrast = _sharpness - 1;
72788               maskFilter += ' contrast(' + contrast + ')';
72789
72790               var brightness = interpolateNumber(1, 0.85)(_sharpness - 1);
72791               maskFilter += ' brightness(' + brightness + ')';
72792           }
72793
72794           var mask = base.selectAll('.layer-unsharp-mask')
72795               .data(detected.cssfilters && _sharpness > 1 ? [0] : []);
72796
72797           mask.exit()
72798               .remove();
72799
72800           mask.enter()
72801               .append('div')
72802               .attr('class', 'layer layer-mask layer-unsharp-mask')
72803               .merge(mask)
72804               .call(baseLayer)
72805               .style('filter', maskFilter || null)
72806               .style('mix-blend-mode', mixBlendMode || null);
72807
72808
72809           var overlays = selection.selectAll('.layer-overlay')
72810               .data(_overlayLayers, function(d) { return d.source().name(); });
72811
72812           overlays.exit()
72813               .remove();
72814
72815           overlays.enter()
72816               .insert('div', '.layer-data')
72817               .attr('class', 'layer layer-overlay')
72818               .merge(overlays)
72819               .each(function(layer) { select(this).call(layer); });
72820       }
72821
72822
72823       background.updateImagery = function() {
72824           var b = baseLayer.source();
72825           if (context.inIntro() || !b) return;
72826
72827           var o = _overlayLayers
72828               .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
72829               .map(function (d) { return d.source().id; })
72830               .join(',');
72831
72832           var meters = geoOffsetToMeters(b.offset());
72833           var epsilon = 0.01;
72834           var x = +meters[0].toFixed(2);
72835           var y = +meters[1].toFixed(2);
72836           var q = utilStringQs(window.location.hash.substring(1));
72837
72838           var id = b.id;
72839           if (id === 'custom') {
72840               id = 'custom:' + b.template();
72841           }
72842
72843           if (id) {
72844               q.background = id;
72845           } else {
72846               delete q.background;
72847           }
72848
72849           if (o) {
72850               q.overlays = o;
72851           } else {
72852               delete q.overlays;
72853           }
72854
72855           if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
72856               q.offset = x + ',' + y;
72857           } else {
72858               delete q.offset;
72859           }
72860
72861           if (!window.mocha) {
72862               window.location.replace('#' + utilQsString(q, true));
72863           }
72864
72865           var imageryUsed = [];
72866
72867           var current = b.imageryUsed();
72868           if (current && _isValid) {
72869               imageryUsed.push(current);
72870           }
72871
72872           _overlayLayers
72873               .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
72874               .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
72875
72876           var data = context.layers().layer('data');
72877           if (data && data.enabled() && data.hasData()) {
72878               imageryUsed.push(data.getSrc());
72879           }
72880
72881           var streetside = context.layers().layer('streetside');
72882           if (streetside && streetside.enabled()) {
72883               imageryUsed.push('Bing Streetside');
72884           }
72885
72886           var mapillary_images = context.layers().layer('mapillary-images');
72887           if (mapillary_images && mapillary_images.enabled()) {
72888               imageryUsed.push('Mapillary Images');
72889           }
72890
72891           var mapillary_signs = context.layers().layer('mapillary-signs');
72892           if (mapillary_signs && mapillary_signs.enabled()) {
72893               imageryUsed.push('Mapillary Signs');
72894           }
72895
72896           var openstreetcam_images = context.layers().layer('openstreetcam-images');
72897           if (openstreetcam_images && openstreetcam_images.enabled()) {
72898               imageryUsed.push('OpenStreetCam Images');
72899           }
72900
72901           context.history().imageryUsed(imageryUsed);
72902       };
72903
72904
72905       background.sources = function(extent) {
72906           if (!data.imagery || !data.imagery.query) return [];   // called before init()?
72907
72908           var matchIDs = {};
72909           var matchImagery = data.imagery.query.bbox(extent.rectangle(), true) || [];
72910           matchImagery.forEach(function(d) { matchIDs[d.id] = true; });
72911
72912           return _backgroundSources.filter(function(source) {
72913               return matchIDs[source.id] || !source.polygon;   // no polygon = worldwide
72914           });
72915       };
72916
72917
72918       background.dimensions = function(d) {
72919           if (!d) return;
72920           baseLayer.dimensions(d);
72921
72922           _overlayLayers.forEach(function(layer) {
72923               layer.dimensions(d);
72924           });
72925       };
72926
72927
72928       background.baseLayerSource = function(d) {
72929           if (!arguments.length) return baseLayer.source();
72930
72931           // test source against OSM imagery blacklists..
72932           var osm = context.connection();
72933           if (!osm) return background;
72934
72935           var blacklists = context.connection().imageryBlacklists();
72936           var template = d.template();
72937           var fail = false;
72938           var tested = 0;
72939           var regex;
72940
72941           for (var i = 0; i < blacklists.length; i++) {
72942               try {
72943                   regex = new RegExp(blacklists[i]);
72944                   fail = regex.test(template);
72945                   tested++;
72946                   if (fail) break;
72947               } catch (e) {
72948                   /* noop */
72949               }
72950           }
72951
72952           // ensure at least one test was run.
72953           if (!tested) {
72954               regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
72955               fail = regex.test(template);
72956           }
72957
72958           baseLayer.source(!fail ? d : background.findSource('none'));
72959           dispatch$1.call('change');
72960           background.updateImagery();
72961           return background;
72962       };
72963
72964
72965       background.findSource = function(id) {
72966           return find$1(_backgroundSources, function(d) {
72967               return d.id && d.id === id;
72968           });
72969       };
72970
72971
72972       background.bing = function() {
72973           background.baseLayerSource(background.findSource('Bing'));
72974       };
72975
72976
72977       background.showsLayer = function(d) {
72978           return d.id === baseLayer.source().id ||
72979               _overlayLayers.some(function(layer) { return d.id === layer.source().id; });
72980       };
72981
72982
72983       background.overlayLayerSources = function() {
72984           return _overlayLayers.map(function (l) { return l.source(); });
72985       };
72986
72987
72988       background.toggleOverlayLayer = function(d) {
72989           var layer;
72990           for (var i = 0; i < _overlayLayers.length; i++) {
72991               layer = _overlayLayers[i];
72992               if (layer.source() === d) {
72993                   _overlayLayers.splice(i, 1);
72994                   dispatch$1.call('change');
72995                   background.updateImagery();
72996                   return;
72997               }
72998           }
72999
73000           layer = rendererTileLayer(context)
73001               .source(d)
73002               .projection(context.projection)
73003               .dimensions(baseLayer.dimensions()
73004           );
73005
73006           _overlayLayers.push(layer);
73007           dispatch$1.call('change');
73008           background.updateImagery();
73009       };
73010
73011
73012       background.nudge = function(d, zoom) {
73013           baseLayer.source().nudge(d, zoom);
73014           dispatch$1.call('change');
73015           background.updateImagery();
73016           return background;
73017       };
73018
73019
73020       background.offset = function(d) {
73021           if (!arguments.length) return baseLayer.source().offset();
73022           baseLayer.source().offset(d);
73023           dispatch$1.call('change');
73024           background.updateImagery();
73025           return background;
73026       };
73027
73028
73029       background.brightness = function(d) {
73030           if (!arguments.length) return _brightness;
73031           _brightness = d;
73032           if (context.mode()) dispatch$1.call('change');
73033           return background;
73034       };
73035
73036
73037       background.contrast = function(d) {
73038           if (!arguments.length) return _contrast;
73039           _contrast = d;
73040           if (context.mode()) dispatch$1.call('change');
73041           return background;
73042       };
73043
73044
73045       background.saturation = function(d) {
73046           if (!arguments.length) return _saturation;
73047           _saturation = d;
73048           if (context.mode()) dispatch$1.call('change');
73049           return background;
73050       };
73051
73052
73053       background.sharpness = function(d) {
73054           if (!arguments.length) return _sharpness;
73055           _sharpness = d;
73056           if (context.mode()) dispatch$1.call('change');
73057           return background;
73058       };
73059
73060
73061       background.init = function() {
73062           function parseMap(qmap) {
73063               if (!qmap) return false;
73064               var args = qmap.split('/').map(Number);
73065               if (args.length < 3 || args.some(isNaN)) return false;
73066               return geoExtent([args[2], args[1]]);
73067           }
73068
73069           var q = utilStringQs(window.location.hash.substring(1));
73070           var requested = q.background || q.layer;
73071           var extent = parseMap(q.map);
73072           var first;
73073           var best;
73074
73075
73076           data.imagery = data.imagery || [];
73077           data.imagery.features = {};
73078
73079           // build efficient index and querying for data.imagery
73080           var features = data.imagery.map(function(source) {
73081               if (!source.polygon) return null;
73082
73083               // Add an extra array nest to each element in `source.polygon`
73084               // so the rings are not treated as a bunch of holes:
73085               // what we have: [ [[outer],[hole],[hole]] ]
73086               // what we want: [ [[outer]],[[outer]],[[outer]] ]
73087               var rings = source.polygon.map(function(ring) { return [ring]; });
73088
73089               var feature = {
73090                   type: 'Feature',
73091                   properties: { id: source.id },
73092                   geometry: { type: 'MultiPolygon', coordinates: rings }
73093               };
73094
73095               data.imagery.features[source.id] = feature;
73096               return feature;
73097
73098           }).filter(Boolean);
73099
73100           data.imagery.query = whichPolygon_1({
73101               type: 'FeatureCollection',
73102               features: features
73103           });
73104
73105
73106           // Add all the available imagery sources
73107           _backgroundSources = data.imagery.map(function(source) {
73108               if (source.type === 'bing') {
73109                   return rendererBackgroundSource.Bing(source, dispatch$1);
73110               } else if (/^EsriWorldImagery/.test(source.id)) {
73111                   return rendererBackgroundSource.Esri(source);
73112               } else {
73113                   return rendererBackgroundSource(source);
73114               }
73115           });
73116
73117           first = _backgroundSources.length && _backgroundSources[0];
73118
73119           // Add 'None'
73120           _backgroundSources.unshift(rendererBackgroundSource.None());
73121
73122           // Add 'Custom'
73123           var template = context.storage('background-custom-template') || '';
73124           var custom = rendererBackgroundSource.Custom(template);
73125           _backgroundSources.unshift(custom);
73126
73127
73128           // Decide which background layer to display
73129           if (!requested && extent) {
73130               best = find$1(this.sources(extent), function(s) { return s.best(); });
73131           }
73132           if (requested && requested.indexOf('custom:') === 0) {
73133               template = requested.replace(/^custom:/, '');
73134               background.baseLayerSource(custom.template(template));
73135               context.storage('background-custom-template', template);
73136           } else {
73137               background.baseLayerSource(
73138                   background.findSource(requested) ||
73139                   best ||
73140                   background.findSource(context.storage('background-last-used')) ||
73141                   background.findSource('Bing') ||
73142                   first ||
73143                   background.findSource('none')
73144               );
73145           }
73146
73147           var locator = find$1(_backgroundSources, function(d) {
73148               return d.overlay && d.default;
73149           });
73150
73151           if (locator) {
73152               background.toggleOverlayLayer(locator);
73153           }
73154
73155           var overlays = (q.overlays || '').split(',');
73156           overlays.forEach(function(overlay) {
73157               overlay = background.findSource(overlay);
73158               if (overlay) {
73159                   background.toggleOverlayLayer(overlay);
73160               }
73161           });
73162
73163           if (q.gpx) {
73164               var gpx = context.layers().layer('data');
73165               if (gpx) {
73166                   gpx.url(q.gpx, '.gpx');
73167               }
73168           }
73169
73170           if (q.offset) {
73171               var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
73172                   return !isNaN(n) && n;
73173               });
73174
73175               if (offset.length === 2) {
73176                   background.offset(geoMetersToOffset(offset));
73177               }
73178           }
73179       };
73180
73181
73182       return utilRebind(background, dispatch$1, 'on');
73183   }
73184
73185   function rendererFeatures(context) {
73186       var traffic_roads = {
73187           'motorway': true,
73188           'motorway_link': true,
73189           'trunk': true,
73190           'trunk_link': true,
73191           'primary': true,
73192           'primary_link': true,
73193           'secondary': true,
73194           'secondary_link': true,
73195           'tertiary': true,
73196           'tertiary_link': true,
73197           'residential': true,
73198           'unclassified': true,
73199           'living_street': true
73200       };
73201
73202       var service_roads = {
73203           'service': true,
73204           'road': true,
73205           'track': true
73206       };
73207
73208       var paths = {
73209           'path': true,
73210           'footway': true,
73211           'cycleway': true,
73212           'bridleway': true,
73213           'steps': true,
73214           'pedestrian': true,
73215           'corridor': true
73216       };
73217
73218       var past_futures = {
73219           'proposed': true,
73220           'construction': true,
73221           'abandoned': true,
73222           'dismantled': true,
73223           'disused': true,
73224           'razed': true,
73225           'demolished': true,
73226           'obliterated': true
73227       };
73228
73229       var dispatch$1 = dispatch('change', 'redraw');
73230       var _cullFactor = 1;
73231       var _cache = {};
73232       var _features = {};
73233       var _stats = {};
73234       var _keys = [];
73235       var _hidden = [];
73236       var _forceVisible = {};
73237
73238
73239       function update() {
73240           if (!window.mocha) {
73241               var q = utilStringQs(window.location.hash.substring(1));
73242               var disabled = features.disabled();
73243               if (disabled.length) {
73244                   q.disable_features = disabled.join(',');
73245               } else {
73246                   delete q.disable_features;
73247               }
73248               window.location.replace('#' + utilQsString(q, true));
73249               context.storage('disabled-features', disabled.join(','));
73250           }
73251           _hidden = features.hidden();
73252           dispatch$1.call('change');
73253           dispatch$1.call('redraw');
73254       }
73255
73256
73257       function defineFeature(k, filter, max) {
73258           var isEnabled = true;
73259
73260           _keys.push(k);
73261           _features[k] = {
73262               filter: filter,
73263               enabled: isEnabled,   // whether the user wants it enabled..
73264               count: 0,
73265               currentMax: (max || Infinity),
73266               defaultMax: (max || Infinity),
73267               enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
73268               disable: function() { this.enabled = false; this.currentMax = 0; },
73269               hidden: function() {
73270                   return !context.editable() ||
73271                       (this.count === 0 && !this.enabled) ||
73272                       this.count > this.currentMax * _cullFactor;
73273               },
73274               autoHidden: function() { return this.hidden() && this.currentMax > 0; }
73275           };
73276       }
73277
73278
73279       defineFeature('points', function isPoint(tags, geometry) {
73280           return geometry === 'point';
73281       }, 200);
73282
73283       defineFeature('traffic_roads', function isTrafficRoad(tags) {
73284           return traffic_roads[tags.highway];
73285       });
73286
73287       defineFeature('service_roads', function isServiceRoad(tags) {
73288           return service_roads[tags.highway];
73289       });
73290
73291       defineFeature('paths', function isPath(tags) {
73292           return paths[tags.highway];
73293       });
73294
73295       defineFeature('buildings', function isBuilding(tags) {
73296           return (
73297               !!tags['building:part'] ||
73298               (!!tags.building && tags.building !== 'no') ||
73299               tags.parking === 'multi-storey' ||
73300               tags.parking === 'sheds' ||
73301               tags.parking === 'carports' ||
73302               tags.parking === 'garage_boxes'
73303           );
73304       }, 250);
73305
73306       defineFeature('landuse', function isLanduse(tags, geometry) {
73307           return geometry === 'area' &&
73308               !_features.buildings.filter(tags) &&
73309               !_features.water.filter(tags);
73310       });
73311
73312       defineFeature('boundaries', function isBoundary(tags) {
73313           return (
73314               !!tags.boundary
73315           ) && !(
73316               traffic_roads[tags.highway] ||
73317               service_roads[tags.highway] ||
73318               paths[tags.highway]
73319           );
73320       });
73321
73322       defineFeature('water', function isWater(tags) {
73323           return (
73324               !!tags.waterway ||
73325               tags.natural === 'water' ||
73326               tags.natural === 'coastline' ||
73327               tags.natural === 'bay' ||
73328               tags.landuse === 'pond' ||
73329               tags.landuse === 'basin' ||
73330               tags.landuse === 'reservoir' ||
73331               tags.landuse === 'salt_pond'
73332           );
73333       });
73334
73335       defineFeature('rail', function isRail(tags) {
73336           return (
73337               !!tags.railway ||
73338               tags.landuse === 'railway'
73339           ) && !(
73340               traffic_roads[tags.highway] ||
73341               service_roads[tags.highway] ||
73342               paths[tags.highway]
73343           );
73344       });
73345
73346       defineFeature('power', function isPower(tags) {
73347           return !!tags.power;
73348       });
73349
73350       // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
73351       defineFeature('past_future', function isPastFuture(tags) {
73352           if (
73353               traffic_roads[tags.highway] ||
73354               service_roads[tags.highway] ||
73355               paths[tags.highway]
73356           ) { return false; }
73357
73358           var strings = Object.keys(tags);
73359
73360           for (var i = 0; i < strings.length; i++) {
73361               var s = strings[i];
73362               if (past_futures[s] || past_futures[tags[s]]) { return true; }
73363           }
73364           return false;
73365       });
73366
73367       // Lines or areas that don't match another feature filter.
73368       // IMPORTANT: The 'others' feature must be the last one defined,
73369       //   so that code in getMatches can skip this test if `hasMatch = true`
73370       defineFeature('others', function isOther(tags, geometry) {
73371           return (geometry === 'line' || geometry === 'area');
73372       });
73373
73374
73375       function features() {}
73376
73377
73378       features.features = function() {
73379           return _features;
73380       };
73381
73382
73383       features.keys = function() {
73384           return _keys;
73385       };
73386
73387
73388       features.enabled = function(k) {
73389           if (!arguments.length) {
73390               return _keys.filter(function(k) { return _features[k].enabled; });
73391           }
73392           return _features[k] && _features[k].enabled;
73393       };
73394
73395
73396       features.disabled = function(k) {
73397           if (!arguments.length) {
73398               return _keys.filter(function(k) { return !_features[k].enabled; });
73399           }
73400           return _features[k] && !_features[k].enabled;
73401       };
73402
73403
73404       features.hidden = function(k) {
73405           if (!arguments.length) {
73406               return _keys.filter(function(k) { return _features[k].hidden(); });
73407           }
73408           return _features[k] && _features[k].hidden();
73409       };
73410
73411
73412       features.autoHidden = function(k) {
73413           if (!arguments.length) {
73414               return _keys.filter(function(k) { return _features[k].autoHidden(); });
73415           }
73416           return _features[k] && _features[k].autoHidden();
73417       };
73418
73419
73420       features.enable = function(k) {
73421           if (_features[k] && !_features[k].enabled) {
73422               _features[k].enable();
73423               update();
73424           }
73425       };
73426
73427
73428       features.disable = function(k) {
73429           if (_features[k] && _features[k].enabled) {
73430               _features[k].disable();
73431               update();
73432           }
73433       };
73434
73435
73436       features.toggle = function(k) {
73437           if (_features[k]) {
73438               (function(f) { return f.enabled ? f.disable() : f.enable(); }(_features[k]));
73439               update();
73440           }
73441       };
73442
73443
73444       features.resetStats = function() {
73445           for (var i = 0; i < _keys.length; i++) {
73446               _features[_keys[i]].count = 0;
73447           }
73448           dispatch$1.call('change');
73449       };
73450
73451
73452       features.gatherStats = function(d, resolver, dimensions) {
73453           var needsRedraw = false;
73454           var type = groupBy(d, function(ent) { return ent.type; });
73455           var entities = [].concat(type.relation || [], type.way || [], type.node || []);
73456           var currHidden, geometry, matches, i, j;
73457
73458           for (i = 0; i < _keys.length; i++) {
73459               _features[_keys[i]].count = 0;
73460           }
73461
73462           // adjust the threshold for point/building culling based on viewport size..
73463           // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
73464           _cullFactor = dimensions[0] * dimensions[1] / 1000000;
73465
73466           for (i = 0; i < entities.length; i++) {
73467               geometry = entities[i].geometry(resolver);
73468               matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
73469               for (j = 0; j < matches.length; j++) {
73470                   _features[matches[j]].count++;
73471               }
73472           }
73473
73474           currHidden = features.hidden();
73475           if (currHidden !== _hidden) {
73476               _hidden = currHidden;
73477               needsRedraw = true;
73478               dispatch$1.call('change');
73479           }
73480
73481           return needsRedraw;
73482       };
73483
73484
73485       features.stats = function() {
73486           for (var i = 0; i < _keys.length; i++) {
73487               _stats[_keys[i]] = _features[_keys[i]].count;
73488           }
73489
73490           return _stats;
73491       };
73492
73493
73494       features.clear = function(d) {
73495           for (var i = 0; i < d.length; i++) {
73496               features.clearEntity(d[i]);
73497           }
73498       };
73499
73500
73501       features.clearEntity = function(entity) {
73502           delete _cache[osmEntity.key(entity)];
73503       };
73504
73505
73506       features.reset = function() {
73507           _cache = {};
73508       };
73509
73510       // only certain relations are worth checking
73511       function relationShouldBeChecked(relation) {
73512           // multipolygon features have `area` geometry and aren't checked here
73513           return relation.tags.type === 'boundary';
73514       }
73515
73516       features.getMatches = function(entity, resolver, geometry) {
73517           if (geometry === 'vertex' ||
73518               (geometry === 'relation' && !relationShouldBeChecked(entity))) return {};
73519
73520           var ent = osmEntity.key(entity);
73521           if (!_cache[ent]) {
73522               _cache[ent] = {};
73523           }
73524
73525           if (!_cache[ent].matches) {
73526               var matches = {};
73527               var hasMatch = false;
73528
73529               for (var i = 0; i < _keys.length; i++) {
73530                   if (_keys[i] === 'others') {
73531                       if (hasMatch) continue;
73532
73533                       // If an entity...
73534                       //   1. is a way that hasn't matched other 'interesting' feature rules,
73535                       if (entity.type === 'way') {
73536                           var parents = features.getParents(entity, resolver, geometry);
73537
73538                           //   2a. belongs only to a single multipolygon relation
73539                           if ((parents.length === 1 && parents[0].isMultipolygon()) ||
73540                               // 2b. or belongs only to boundary relations
73541                               (parents.length > 0 && parents.every(function(parent) { return parent.tags.type === 'boundary'; }))) {
73542
73543                               // ...then match whatever feature rules the parent relation has matched.
73544                               // see #2548, #2887
73545                               //
73546                               // IMPORTANT:
73547                               // For this to work, getMatches must be called on relations before ways.
73548                               //
73549                               var pkey = osmEntity.key(parents[0]);
73550                               if (_cache[pkey] && _cache[pkey].matches) {
73551                                   matches = clone(_cache[pkey].matches);
73552                                   continue;
73553                               }
73554                           }
73555                       }
73556                   }
73557
73558                   if (_features[_keys[i]].filter(entity.tags, geometry)) {
73559                       matches[_keys[i]] = hasMatch = true;
73560                   }
73561               }
73562               _cache[ent].matches = matches;
73563           }
73564
73565           return _cache[ent].matches;
73566       };
73567
73568
73569       features.getParents = function(entity, resolver, geometry) {
73570           if (geometry === 'point') return [];
73571
73572           var ent = osmEntity.key(entity);
73573           if (!_cache[ent]) {
73574               _cache[ent] = {};
73575           }
73576
73577           if (!_cache[ent].parents) {
73578               var parents = [];
73579               if (geometry === 'vertex') {
73580                   parents = resolver.parentWays(entity);
73581               } else {   // 'line', 'area', 'relation'
73582                   parents = resolver.parentRelations(entity);
73583               }
73584               _cache[ent].parents = parents;
73585           }
73586           return _cache[ent].parents;
73587       };
73588
73589
73590       features.isHiddenPreset = function(preset, geometry) {
73591           if (!_hidden.length) return false;
73592           if (!preset.tags) return false;
73593           for (var i = 0; i < _hidden.length; i++) {
73594               if (_features[_hidden[i]].filter(preset.setTags({}, geometry), geometry)) {
73595                   return _hidden[i];
73596               }
73597           }
73598           return false;
73599       };
73600
73601
73602       features.isHiddenFeature = function(entity, resolver, geometry) {
73603           if (!_hidden.length) return false;
73604           if (!entity.version) return false;
73605
73606           var matches = features.getMatches(entity, resolver, geometry);
73607
73608           for (var i = 0; i < _hidden.length; i++) {
73609               if (matches[_hidden[i]]) return true;
73610           }
73611           return false;
73612       };
73613
73614
73615       features.isHiddenChild = function(entity, resolver, geometry) {
73616           if (!_hidden.length) return false;
73617           if (!entity.version || geometry === 'point') return false;
73618
73619           var parents = features.getParents(entity, resolver, geometry);
73620           if (!parents.length) return false;
73621
73622           for (var i = 0; i < parents.length; i++) {
73623               if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
73624                   return false;
73625               }
73626           }
73627           return true;
73628       };
73629
73630
73631       features.hasHiddenConnections = function(entity, resolver) {
73632           if (!_hidden.length) return false;
73633           var childNodes, connections;
73634
73635           if (entity.type === 'midpoint') {
73636               childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
73637               connections = [];
73638           } else {
73639               childNodes = entity.nodes ? resolver.childNodes(entity) : [];
73640               connections = features.getParents(entity, resolver, entity.geometry(resolver));
73641           }
73642
73643           // gather ways connected to child nodes..
73644           connections = reduce(childNodes, function(result, e) {
73645               return resolver.isShared(e) ? union(result, resolver.parentWays(e)) : result;
73646           }, connections);
73647
73648           return connections.length ? some(connections, function(e) {
73649               return features.isHidden(e, resolver, e.geometry(resolver));
73650           }) : false;
73651       };
73652
73653
73654       features.isHidden = function(entity, resolver, geometry) {
73655           if (!_hidden.length) return false;
73656           if (!entity.version) return false;
73657           if (_forceVisible[entity.id]) return false;
73658
73659           var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
73660           return fn(entity, resolver, geometry);
73661       };
73662
73663
73664       features.filter = function(d, resolver) {
73665           if (!_hidden.length) return d;
73666
73667           var result = [];
73668           for (var i = 0; i < d.length; i++) {
73669               var entity = d[i];
73670               if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
73671                   result.push(entity);
73672               }
73673           }
73674           return result;
73675       };
73676
73677
73678       features.forceVisible = function(entityIDs) {
73679           if (!arguments.length) return Object.keys(_forceVisible);
73680           _forceVisible = {};
73681           for (var i = 0; i < entityIDs.length; i++) {
73682               _forceVisible[entityIDs[i]] = true;
73683           }
73684           return features;
73685       };
73686
73687
73688       features.init = function() {
73689           var storage = context.storage('disabled-features');
73690           if (storage) {
73691               var storageDisabled = storage.replace(/;/g, ',').split(',');
73692               storageDisabled.forEach(features.disable);
73693           }
73694
73695           var q = utilStringQs(window.location.hash.substring(1));
73696           if (q.disable_features) {
73697               var hashDisabled = q.disable_features.replace(/;/g, ',').split(',');
73698               hashDisabled.forEach(features.disable);
73699           }
73700       };
73701
73702       return utilRebind(features, dispatch$1, 'on');
73703   }
73704
73705   function utilBindOnce(target, type, listener, capture) {
73706       var typeOnce = type + '.once';
73707       function one() {
73708           target.on(typeOnce, null);
73709           listener.apply(this, arguments);
73710       }
73711       target.on(typeOnce, one, capture);
73712       return this;
73713   }
73714
73715   // constants
73716   var TILESIZE = 256;
73717   var kMin = geoZoomToScale(2, TILESIZE);
73718   var kMax = geoZoomToScale(24, TILESIZE);
73719
73720   function clamp(num, min, max) {
73721       return Math.max(min, Math.min(num, max));
73722   }
73723
73724
73725   function rendererMap(context) {
73726       var dispatch$1 = dispatch('move', 'drawn');
73727       var projection = context.projection;
73728       var curtainProjection = context.curtainProjection;
73729       var drawLayers = svgLayers(projection, context);
73730       var drawPoints = svgPoints(projection, context);
73731       var drawVertices = svgVertices(projection, context);
73732       var drawLines = svgLines(projection, context);
73733       var drawAreas = svgAreas(projection, context);
73734       var drawMidpoints = svgMidpoints(projection, context);
73735       var drawLabels = svgLabels(projection, context);
73736
73737       var _selection = select(null);
73738       var supersurface = select(null);
73739       var wrapper = select(null);
73740       var surface = select(null);
73741
73742       var _dimensions = [1, 1];
73743       var _dblClickEnabled = true;
73744       var _redrawEnabled = true;
73745       var _gestureTransformStart;
73746       var _transformStart = projection.transform();
73747       var _transformLast;
73748       var _isTransformed = false;
73749       var _minzoom = 0;
73750       var _getMouseCoords;
73751       var _mouseEvent;
73752
73753       var zoom = d3_zoom()
73754           .scaleExtent([kMin, kMax])
73755           .interpolate(interpolate)
73756           .filter(zoomEventFilter)
73757           .on('zoom', zoomPan);
73758
73759       var scheduleRedraw = throttle(redraw, 750);
73760       // var isRedrawScheduled = false;
73761       // var pendingRedrawCall;
73762       // function scheduleRedraw() {
73763       //     // Only schedule the redraw if one has not already been set.
73764       //     if (isRedrawScheduled) return;
73765       //     isRedrawScheduled = true;
73766       //     var that = this;
73767       //     var args = arguments;
73768       //     pendingRedrawCall = window.requestIdleCallback(function () {
73769       //         // Reset the boolean so future redraws can be set.
73770       //         isRedrawScheduled = false;
73771       //         redraw.apply(that, args);
73772       //     }, { timeout: 1400 });
73773       // }
73774
73775       function cancelPendingRedraw() {
73776           scheduleRedraw.cancel();
73777           // isRedrawScheduled = false;
73778           // window.cancelIdleCallback(pendingRedrawCall);
73779       }
73780
73781
73782       function map(selection) {
73783           _selection = selection;
73784
73785           context
73786               .on('change.map', immediateRedraw);
73787
73788           var osm = context.connection();
73789           if (osm) {
73790               osm.on('change.map', immediateRedraw);
73791           }
73792
73793           context.history()
73794               .on('change.map', immediateRedraw)
73795               .on('undone.map redone.map', function(stack) {
73796                   var mode = context.mode().id;
73797                   if (mode !== 'browse' && mode !== 'select') return;
73798
73799                   var followSelected = false;
73800                   if (Array.isArray(stack.selectedIDs)) {
73801                       followSelected = (stack.selectedIDs.length === 1 && stack.selectedIDs[0][0] === 'n');
73802                       context.enter(
73803                           modeSelect(context, stack.selectedIDs).follow(followSelected)
73804                       );
73805                   }
73806                   if (!followSelected && stack.transform) {
73807                       map.transformEase(stack.transform);
73808                   }
73809               });
73810
73811           context.background()
73812               .on('change.map', immediateRedraw);
73813
73814           context.features()
73815               .on('redraw.map', immediateRedraw);
73816
73817           drawLayers
73818               .on('change.map', function() {
73819                   context.background().updateImagery();
73820                   immediateRedraw();
73821               });
73822
73823           selection
73824               .on('dblclick.map', dblClick)
73825               .call(zoom)
73826               .call(zoom.transform, projection.transform());
73827
73828           supersurface = selection.append('div')
73829               .attr('id', 'supersurface')
73830               .call(utilSetTransform, 0, 0);
73831
73832           // Need a wrapper div because Opera can't cope with an absolutely positioned
73833           // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
73834           wrapper = supersurface
73835               .append('div')
73836               .attr('class', 'layer layer-data');
73837
73838           map.surface = surface = wrapper
73839               .call(drawLayers)
73840               .selectAll('.surface')
73841               .attr('id', 'surface');
73842
73843           surface
73844               .call(drawLabels.observe)
73845               .on('gesturestart.surface', function() {
73846                   _gestureTransformStart = projection.transform();
73847               })
73848               .on('gesturechange.surface', gestureChange)
73849               .on('mousedown.zoom', function() {
73850                   if (event.button === 2) {
73851                       event.stopPropagation();
73852                   }
73853               }, true)
73854               .on('mouseup.zoom', function() {
73855                   if (resetTransform()) {
73856                       immediateRedraw();
73857                   }
73858               })
73859               .on('mousemove.map', function() {
73860                   _mouseEvent = event;
73861               })
73862               .on('mouseover.vertices', function() {
73863                   if (map.editable() && !_isTransformed) {
73864                       var hover = event.target.__data__;
73865                       surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
73866                       dispatch$1.call('drawn', this, { full: false });
73867                   }
73868               })
73869               .on('mouseout.vertices', function() {
73870                   if (map.editable() && !_isTransformed) {
73871                       var hover = event.relatedTarget && event.relatedTarget.__data__;
73872                       surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
73873                       dispatch$1.call('drawn', this, { full: false });
73874                   }
73875               });
73876
73877           supersurface
73878               .call(context.background());
73879
73880           context.on('enter.map',  function() {
73881               if (map.editable() && !_isTransformed) {
73882                   // redraw immediately any objects affected by a change in selectedIDs.
73883                   var graph = context.graph();
73884                   var selectedAndParents = {};
73885                   context.selectedIDs().forEach(function(id) {
73886                       var entity = graph.hasEntity(id);
73887                       if (entity) {
73888                           selectedAndParents[entity.id] = entity;
73889                           if (entity.type === 'node') {
73890                               graph.parentWays(entity).forEach(function(parent) {
73891                                   selectedAndParents[parent.id] = parent;
73892                               });
73893                           }
73894                       }
73895                   });
73896                   var data = values$1(selectedAndParents);
73897                   var filter = function(d) { return d.id in selectedAndParents; };
73898
73899                   data = context.features().filter(data, graph);
73900
73901                   surface
73902                       .call(drawVertices.drawSelected, graph, map.extent())
73903                       .call(drawLines, graph, data, filter)
73904                       .call(drawAreas, graph, data, filter)
73905                       .call(drawMidpoints, graph, data, filter, map.trimmedExtent());
73906
73907                   dispatch$1.call('drawn', this, { full: false });
73908
73909                   // redraw everything else later
73910                   scheduleRedraw();
73911               }
73912           });
73913
73914           map.dimensions(utilGetDimensions(selection));
73915       }
73916
73917
73918       function zoomEventFilter() {
73919           // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
73920           // Intercept `mousedown` and check if there is an orphaned zoom gesture.
73921           // This can happen if a previous `mousedown` occurred without a `mouseup`.
73922           // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
73923           // so that d3-zoom won't stop propagation of new `mousedown` events.
73924           if (event.type === 'mousedown') {
73925               var hasOrphan = false;
73926               var listeners = window.__on;
73927               for (var i = 0; i < listeners.length; i++) {
73928                   var listener = listeners[i];
73929                   if (listener.name === 'zoom' && listener.type === 'mouseup') {
73930                       hasOrphan = true;
73931                       break;
73932                   }
73933               }
73934               if (hasOrphan) {
73935                   var event$1 = window.CustomEvent;
73936                   if (event$1) {
73937                       event$1 = new event$1('mouseup');
73938                   } else {
73939                       event$1 = window.document.createEvent('Event');
73940                       event$1.initEvent('mouseup', false, false);
73941                   }
73942                   // Event needs to be dispatched with an event.view property.
73943                   event$1.view = window;
73944                   window.dispatchEvent(event$1);
73945               }
73946           }
73947
73948           return event.button !== 2;   // ignore right clicks
73949       }
73950
73951
73952       function pxCenter() {
73953           return [_dimensions[0] / 2, _dimensions[1] / 2];
73954       }
73955
73956
73957       function drawVector(difference, extent) {
73958           var mode = context.mode();
73959           var graph = context.graph();
73960           var features = context.features();
73961           var all = context.intersects(map.extent());
73962           var fullRedraw = false;
73963           var data;
73964           var filter;
73965
73966           if (difference) {
73967               var complete = difference.complete(map.extent());
73968               data = compact(values$1(complete));
73969               filter = function(d) { return d.id in complete; };
73970               features.clear(data);
73971
73972           } else {
73973               // force a full redraw if gatherStats detects that a feature
73974               // should be auto-hidden (e.g. points or buildings)..
73975               if (features.gatherStats(all, graph, _dimensions)) {
73976                   extent = undefined;
73977               }
73978
73979               if (extent) {
73980                   data = context.intersects(map.extent().intersection(extent));
73981                   var set = set$2(map$3(data, 'id'));
73982                   filter = function(d) { return set.has(d.id); };
73983
73984               } else {
73985                   data = all;
73986                   fullRedraw = true;
73987                   filter = utilFunctor(true);
73988               }
73989           }
73990
73991           data = features.filter(data, graph);
73992
73993           if (mode && mode.id === 'select') {
73994               // update selected vertices - the user might have just double-clicked a way,
73995               // creating a new vertex, triggering a partial redraw without a mode change
73996               surface.call(drawVertices.drawSelected, graph, map.extent());
73997           }
73998
73999           surface
74000               .call(drawVertices, graph, data, filter, map.extent(), fullRedraw)
74001               .call(drawLines, graph, data, filter)
74002               .call(drawAreas, graph, data, filter)
74003               .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
74004               .call(drawLabels, graph, data, filter, _dimensions, fullRedraw)
74005               .call(drawPoints, graph, data, filter);
74006
74007           dispatch$1.call('drawn', this, {full: true});
74008       }
74009
74010
74011       function editOff() {
74012           context.features().resetStats();
74013           surface.selectAll('.layer-osm *').remove();
74014           surface.selectAll('.layer-touch:not(.markers) *').remove();
74015
74016           var allowed = {
74017               'browse': true,
74018               'save': true,
74019               'select-note': true,
74020               'select-data': true,
74021               'select-error': true
74022           };
74023
74024           var mode = context.mode();
74025           if (mode && !allowed[mode.id]) {
74026               context.enter(modeBrowse(context));
74027           }
74028
74029           dispatch$1.call('drawn', this, {full: true});
74030       }
74031
74032
74033       function dblClick() {
74034           if (!_dblClickEnabled) {
74035               event.preventDefault();
74036               event.stopImmediatePropagation();
74037           }
74038       }
74039
74040
74041       function gestureChange() {
74042           // Remap Safari gesture events to wheel events - #5492
74043           // We want these disabled most places, but enabled for zoom/unzoom on map surface
74044           // https://developer.mozilla.org/en-US/docs/Web/API/GestureEvent
74045           var e = event;
74046           e.preventDefault();
74047
74048           var props = {
74049               deltaMode: 0,    // dummy values to ignore in zoomPan
74050               deltaY: 1,       // dummy values to ignore in zoomPan
74051               clientX: e.clientX,
74052               clientY: e.clientY,
74053               screenX: e.screenX,
74054               screenY: e.screenY,
74055               x: e.x,
74056               y: e.y
74057           };
74058
74059           var e2 = new WheelEvent('wheel', props);
74060           e2._scale = e.scale;         // preserve the original scale
74061           e2._rotation = e.rotation;   // preserve the original rotation
74062
74063           _selection.node().dispatchEvent(e2);
74064       }
74065
74066
74067       function zoomPan(manualEvent) {
74068           var event$1 = (manualEvent || event);
74069           var source = event$1.sourceEvent;
74070           var eventTransform = event$1.transform;
74071           var x = eventTransform.x;
74072           var y = eventTransform.y;
74073           var k = eventTransform.k;
74074
74075           if (_transformStart.x === x &&
74076               _transformStart.y === y &&
74077               _transformStart.k === k) {
74078               return;  // no change
74079           }
74080
74081           // Special handling of 'wheel' events:
74082           // They might be triggered by the user scrolling the mouse wheel,
74083           // or 2-finger pinch/zoom gestures, the transform may need adjustment.
74084           if (source && source.type === 'wheel') {
74085               var detected = utilDetect();
74086               var dX = source.deltaX;
74087               var dY = source.deltaY;
74088               var x2 = x;
74089               var y2 = y;
74090               var k2 = k;
74091               var t0, p0, p1;
74092
74093               // Normalize mousewheel scroll speed (Firefox) - #3029
74094               // If wheel delta is provided in LINE units, recalculate it in PIXEL units
74095               // We are essentially redoing the calculations that occur here:
74096               //   https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
74097               // See this for more info:
74098               //   https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
74099               if (source.deltaMode === 1 /* LINE */) {
74100                   // Convert from lines to pixels, more if the user is scrolling fast.
74101                   // (I made up the exp function to roughly match Firefox to what Chrome does)
74102                   // These numbers should be floats, because integers are treated as pan gesture below.
74103                   var lines = Math.abs(source.deltaY);
74104                   var sign = (source.deltaY > 0) ? 1 : -1;
74105                   dY = sign * clamp(
74106                       Math.exp((lines - 1) * 0.75) * 4.000244140625,
74107                       4.000244140625,    // min
74108                       350.000244140625   // max
74109                   );
74110
74111                   // On Firefox Windows and Linux we always get +/- the scroll line amount (default 3)
74112                   // There doesn't seem to be any scroll accelleration.
74113                   // This multiplier increases the speed a little bit - #5512
74114                   if (detected.os !== 'mac') {
74115                       dY *= 5;
74116                   }
74117
74118                   // recalculate x2,y2,k2
74119                   t0 = _isTransformed ? _transformLast : _transformStart;
74120                   p0 = _getMouseCoords(source);
74121                   p1 = t0.invert(p0);
74122                   k2 = t0.k * Math.pow(2, -dY / 500);
74123                   x2 = p0[0] - p1[0] * k2;
74124                   y2 = p0[1] - p1[1] * k2;
74125
74126               // 2 finger map pinch zooming (Safari) - #5492
74127               // These are fake `wheel` events we made from Safari `gesturechange` events..
74128               } else if (source._scale) {
74129                   // recalculate x2,y2,k2
74130                   t0 = _gestureTransformStart;
74131                   p0 = _getMouseCoords(source);
74132                   p1 = t0.invert(p0);
74133                   k2 = t0.k * source._scale;
74134                   x2 = p0[0] - p1[0] * k2;
74135                   y2 = p0[1] - p1[1] * k2;
74136
74137               // 2 finger map pinch zooming (all browsers except Safari) - #5492
74138               // Pinch zooming via the `wheel` event will always have:
74139               // - `ctrlKey = true`
74140               // - `deltaY` is not round integer pixels (ignore `deltaX`)
74141               } else if (source.ctrlKey && !isInteger(dY)) {
74142                   dY *= 6;   // slightly scale up whatever the browser gave us
74143
74144                   // recalculate x2,y2,k2
74145                   t0 = _isTransformed ? _transformLast : _transformStart;
74146                   p0 = _getMouseCoords(source);
74147                   p1 = t0.invert(p0);
74148                   k2 = t0.k * Math.pow(2, -dY / 500);
74149                   x2 = p0[0] - p1[0] * k2;
74150                   y2 = p0[1] - p1[1] * k2;
74151
74152               // Trackpad scroll zooming with shift or alt/option key down
74153               } else if ((source.altKey || source.shiftKey) && isInteger(dY)) {
74154                   // recalculate x2,y2,k2
74155                   t0 = _isTransformed ? _transformLast : _transformStart;
74156                   p0 = _getMouseCoords(source);
74157                   p1 = t0.invert(p0);
74158                   k2 = t0.k * Math.pow(2, -dY / 500);
74159                   x2 = p0[0] - p1[0] * k2;
74160                   y2 = p0[1] - p1[1] * k2;
74161
74162               // 2 finger map panning (Mac only, all browsers) - #5492, #5512
74163               // Panning via the `wheel` event will always have:
74164               // - `ctrlKey = false`
74165               // - `deltaX`,`deltaY` are round integer pixels
74166               } else if (detected.os === 'mac' && !source.ctrlKey && isInteger(dX) && isInteger(dY)) {
74167                   p1 = projection.translate();
74168                   x2 = p1[0] - dX;
74169                   y2 = p1[1] - dY;
74170                   k2 = projection.scale();
74171               }
74172
74173               // something changed - replace the event transform
74174               if (x2 !== x || y2 !== y || k2 !== k) {
74175                   x = x2;
74176                   y = y2;
74177                   k = k2;
74178                   eventTransform = identity$7.translate(x2, y2).scale(k2);
74179                   _selection.node().__zoom = eventTransform;
74180               }
74181
74182           }
74183
74184           if (geoScaleToZoom(k, TILESIZE) < _minzoom) {
74185               surface.interrupt();
74186               uiFlash().text(t('cannot_zoom'))();
74187               setCenterZoom(map.center(), context.minEditableZoom(), 0, true);
74188               scheduleRedraw();
74189               dispatch$1.call('move', this, map);
74190               return;
74191           }
74192
74193           projection.transform(eventTransform);
74194
74195           var scale = k / _transformStart.k;
74196           var tX = (x / scale - _transformStart.x) * scale;
74197           var tY = (y / scale - _transformStart.y) * scale;
74198
74199           if (context.inIntro()) {
74200               curtainProjection.transform({
74201                   x: x - tX,
74202                   y: y - tY,
74203                   k: k
74204               });
74205           }
74206
74207           if (source) {
74208               _mouseEvent = event$1;
74209           }
74210           _isTransformed = true;
74211           _transformLast = eventTransform;
74212           utilSetTransform(supersurface, tX, tY, scale);
74213           scheduleRedraw();
74214
74215           dispatch$1.call('move', this, map);
74216
74217
74218           function isInteger(val) {
74219               return typeof val === 'number' && isFinite(val) && Math.floor(val) === val;
74220           }
74221       }
74222
74223
74224       function resetTransform() {
74225           if (!_isTransformed) return false;
74226
74227           // deprecation warning - Radial Menu to be removed in iD v3
74228           surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
74229           utilSetTransform(supersurface, 0, 0);
74230           _isTransformed = false;
74231           if (context.inIntro()) {
74232               curtainProjection.transform(projection.transform());
74233           }
74234           return true;
74235       }
74236
74237
74238       function redraw(difference, extent) {
74239           if (surface.empty() || !_redrawEnabled) return;
74240
74241           // If we are in the middle of a zoom/pan, we can't do differenced redraws.
74242           // It would result in artifacts where differenced entities are redrawn with
74243           // one transform and unchanged entities with another.
74244           if (resetTransform()) {
74245               difference = extent = undefined;
74246           }
74247
74248           var zoom = map.zoom();
74249           var z = String(~~zoom);
74250
74251           if (surface.attr('data-zoom') !== z) {
74252               surface.attr('data-zoom', z);
74253           }
74254
74255           // class surface as `lowzoom` around z17-z18.5 (based on latitude)
74256           var lat = map.center()[1];
74257           var lowzoom = linear$2()
74258               .domain([-60, 0, 60])
74259               .range([17, 18.5, 17])
74260               .clamp(true);
74261
74262           surface
74263               .classed('low-zoom', zoom <= lowzoom(lat));
74264
74265
74266           if (!difference) {
74267               supersurface.call(context.background());
74268           }
74269
74270           wrapper
74271               .call(drawLayers);
74272
74273           // OSM
74274           if (map.editable()) {
74275               context.loadTiles(projection);
74276               drawVector(difference, extent);
74277           } else {
74278               editOff();
74279           }
74280
74281           _transformStart = projection.transform();
74282
74283           return map;
74284       }
74285
74286
74287
74288       var immediateRedraw = function(difference, extent) {
74289           if (!difference && !extent) cancelPendingRedraw();
74290           redraw(difference, extent);
74291       };
74292
74293
74294       map.mouse = function() {
74295           var event$1 = _mouseEvent || event;
74296           if (event$1) {
74297               var s;
74298               while ((s = event$1.sourceEvent)) { event$1 = s; }
74299               return _getMouseCoords(event$1);
74300           }
74301           return null;
74302       };
74303
74304
74305       // returns Lng/Lat
74306       map.mouseCoordinates = function() {
74307           var coord = map.mouse() || pxCenter();
74308           return projection.invert(coord);
74309       };
74310
74311
74312       map.dblclickEnable = function(val) {
74313           if (!arguments.length) return _dblClickEnabled;
74314           _dblClickEnabled = val;
74315           return map;
74316       };
74317
74318
74319       map.redrawEnable = function(val) {
74320           if (!arguments.length) return _redrawEnabled;
74321           _redrawEnabled = val;
74322           return map;
74323       };
74324
74325
74326       map.isTransformed = function() {
74327           return _isTransformed;
74328       };
74329
74330
74331       function setTransform(t2, duration, force) {
74332           var t = projection.transform();
74333           if (!force && t2.k === t.k && t2.x === t.x && t2.y === t.y) return false;
74334
74335           if (duration) {
74336               _selection
74337                   .transition()
74338                   .duration(duration)
74339                   .on('start', function() { map.startEase(); })
74340                   .call(zoom.transform, identity$7.translate(t2.x, t2.y).scale(t2.k));
74341           } else {
74342               projection.transform(t2);
74343               _transformStart = t2;
74344               _selection.call(zoom.transform, _transformStart);
74345           }
74346
74347           return true;
74348       }
74349
74350
74351       function setCenterZoom(loc2, z2, duration, force) {
74352           var c = map.center();
74353           var z = map.zoom();
74354           if (loc2[0] === c[0] && loc2[1] === c[1] && z2 === z && !force) return false;
74355
74356           var proj = geoRawMercator().transform(projection.transform());  // copy projection
74357
74358           var k2 = clamp(geoZoomToScale(z2, TILESIZE), kMin, kMax);
74359           proj.scale(k2);
74360
74361           var t = proj.translate();
74362           var point = proj(loc2);
74363
74364           var center = pxCenter();
74365           t[0] += center[0] - point[0];
74366           t[1] += center[1] - point[1];
74367
74368           return setTransform(identity$7.translate(t[0], t[1]).scale(k2), duration, force);
74369       }
74370
74371
74372       map.pan = function(delta, duration) {
74373           var t = projection.translate();
74374           var k = projection.scale();
74375
74376           t[0] += delta[0];
74377           t[1] += delta[1];
74378
74379           if (duration) {
74380               _selection
74381                   .transition()
74382                   .duration(duration)
74383                   .on('start', function() { map.startEase(); })
74384                   .call(zoom.transform, identity$7.translate(t[0], t[1]).scale(k));
74385           } else {
74386               projection.translate(t);
74387               _transformStart = projection.transform();
74388               _selection.call(zoom.transform, _transformStart);
74389               dispatch$1.call('move', this, map);
74390               immediateRedraw();
74391           }
74392
74393           return map;
74394       };
74395
74396
74397       map.dimensions = function(val) {
74398           if (!arguments.length) return _dimensions;
74399
74400           _dimensions = val;
74401           drawLayers.dimensions(_dimensions);
74402           context.background().dimensions(_dimensions);
74403           projection.clipExtent([[0, 0], _dimensions]);
74404           _getMouseCoords = utilFastMouse(supersurface.node());
74405
74406           scheduleRedraw();
74407           return map;
74408       };
74409
74410
74411       function zoomIn(delta) {
74412           setCenterZoom(map.center(), ~~map.zoom() + delta, 250, true);
74413       }
74414
74415       function zoomOut(delta) {
74416           setCenterZoom(map.center(), ~~map.zoom() - delta, 250, true);
74417       }
74418
74419       map.zoomIn = function() { zoomIn(1); };
74420       map.zoomInFurther = function() { zoomIn(4); };
74421
74422       map.zoomOut = function() { zoomOut(1); };
74423       map.zoomOutFurther = function() { zoomOut(4); };
74424
74425
74426       map.center = function(loc2) {
74427           if (!arguments.length) {
74428               return projection.invert(pxCenter());
74429           }
74430
74431           if (setCenterZoom(loc2, map.zoom())) {
74432               dispatch$1.call('move', this, map);
74433           }
74434
74435           scheduleRedraw();
74436           return map;
74437       };
74438
74439
74440       map.zoom = function(z2) {
74441           if (!arguments.length) {
74442               return Math.max(geoScaleToZoom(projection.scale(), TILESIZE), 0);
74443           }
74444
74445           if (z2 < _minzoom) {
74446               surface.interrupt();
74447               uiFlash().text(t('cannot_zoom'))();
74448               z2 = context.minEditableZoom();
74449           }
74450
74451           if (setCenterZoom(map.center(), z2)) {
74452               dispatch$1.call('move', this, map);
74453           }
74454
74455           scheduleRedraw();
74456           return map;
74457       };
74458
74459
74460       map.centerZoom = function(loc2, z2) {
74461           if (setCenterZoom(loc2, z2)) {
74462               dispatch$1.call('move', this, map);
74463           }
74464
74465           scheduleRedraw();
74466           return map;
74467       };
74468
74469
74470       map.zoomTo = function(entity) {
74471           var extent = entity.extent(context.graph());
74472           if (!isFinite(extent.area())) return map;
74473
74474           var z2 = clamp(map.trimmedExtentZoom(extent), context.minEditableZoom(), 20);
74475           return map.centerZoom(extent.center(), z2);
74476       };
74477
74478
74479       map.centerEase = function(loc2, duration) {
74480           duration = duration || 250;
74481           setCenterZoom(loc2, map.zoom(), duration);
74482           return map;
74483       };
74484
74485
74486       map.zoomEase = function(z2, duration) {
74487           duration = duration || 250;
74488           setCenterZoom(map.center(), z2, duration, false);
74489           return map;
74490       };
74491
74492
74493       map.centerZoomEase = function(loc2, z2, duration) {
74494           duration = duration || 250;
74495           setCenterZoom(loc2, z2, duration, false);
74496           return map;
74497       };
74498
74499
74500       map.transformEase = function(t2, duration) {
74501           duration = duration || 250;
74502           setTransform(t2, duration, false);
74503           return map;
74504       };
74505
74506
74507       map.zoomToEase = function(entity, duration) {
74508           var extent = entity.extent(context.graph());
74509           if (!isFinite(extent.area())) return map;
74510
74511           var z2 = clamp(map.trimmedExtentZoom(extent), context.minEditableZoom(), 20);
74512           return map.centerZoomEase(extent.center(), z2, duration);
74513       };
74514
74515
74516       map.startEase = function() {
74517           utilBindOnce(surface, 'mousedown.ease', function() {
74518               map.cancelEase();
74519           });
74520           return map;
74521       };
74522
74523
74524       map.cancelEase = function() {
74525           _selection.interrupt();
74526           return map;
74527       };
74528
74529
74530       map.extent = function(val) {
74531           if (!arguments.length) {
74532               return new geoExtent(
74533                   projection.invert([0, _dimensions[1]]),
74534                   projection.invert([_dimensions[0], 0])
74535               );
74536           } else {
74537               var extent = geoExtent(val);
74538               map.centerZoom(extent.center(), map.extentZoom(extent));
74539           }
74540       };
74541
74542
74543       map.trimmedExtent = function(val) {
74544           if (!arguments.length) {
74545               var headerY = 60;
74546               var footerY = 30;
74547               var pad = 10;
74548               return new geoExtent(
74549                   projection.invert([pad, _dimensions[1] - footerY - pad]),
74550                   projection.invert([_dimensions[0] - pad, headerY + pad])
74551               );
74552           } else {
74553               var extent = geoExtent(val);
74554               map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
74555           }
74556       };
74557
74558
74559       function calcExtentZoom(extent, dim) {
74560           var tl = projection([extent[0][0], extent[1][1]]);
74561           var br = projection([extent[1][0], extent[0][1]]);
74562
74563           // Calculate maximum zoom that fits extent
74564           var hFactor = (br[0] - tl[0]) / dim[0];
74565           var vFactor = (br[1] - tl[1]) / dim[1];
74566           var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
74567           var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
74568           var newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
74569
74570           return newZoom;
74571       }
74572
74573
74574       map.extentZoom = function(val) {
74575           return calcExtentZoom(geoExtent(val), _dimensions);
74576       };
74577
74578
74579       map.trimmedExtentZoom = function(val) {
74580           var trimY = 120;
74581           var trimX = 40;
74582           var trimmed = [_dimensions[0] - trimX, _dimensions[1] - trimY];
74583           return calcExtentZoom(geoExtent(val), trimmed);
74584       };
74585
74586
74587       map.editable = function() {
74588           var osmLayer = surface.selectAll('.data-layer.osm');
74589           if (!osmLayer.empty() && osmLayer.classed('disabled')) return false;
74590
74591           return map.zoom() >= context.minEditableZoom();
74592       };
74593
74594
74595       map.notesEditable = function() {
74596           var noteLayer = surface.selectAll('.data-layer.notes');
74597           if (!noteLayer.empty() && noteLayer.classed('disabled')) return false;
74598
74599           return map.zoom() >= context.minEditableZoom();
74600       };
74601
74602
74603       map.minzoom = function(val) {
74604           if (!arguments.length) return _minzoom;
74605           _minzoom = val;
74606           return map;
74607       };
74608
74609
74610       map.layers = drawLayers;
74611
74612
74613       return utilRebind(map, dispatch$1, 'on');
74614   }
74615
74616   function uiMapInMap(context) {
74617
74618       function map_in_map(selection) {
74619           var backgroundLayer = rendererTileLayer(context);
74620           var overlayLayers = {};
74621           var projection = geoRawMercator();
74622           var dataLayer = svgData(projection, context).showLabels(false);
74623           var debugLayer = svgDebug(projection, context);
74624           var zoom = d3_zoom()
74625               .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)])
74626               .on('start', zoomStarted)
74627               .on('zoom', zoomed)
74628               .on('end', zoomEnded);
74629           var isTransformed = false;
74630           var isHidden = true;
74631           var skipEvents = false;
74632           var gesture = null;
74633           var zDiff = 6;    // by default, minimap renders at (main zoom - 6)
74634           var wrap = select(null);
74635           var tiles = select(null);
74636           var viewport = select(null);
74637           var tStart;    // transform at start of gesture
74638           var tCurr;     // transform at most recent event
74639           var timeoutId;
74640
74641
74642           function zoomStarted() {
74643               if (skipEvents) return;
74644               tStart = tCurr = projection.transform();
74645               gesture = null;
74646           }
74647
74648
74649           function zoomed() {
74650               if (skipEvents) return;
74651
74652               var x = event.transform.x;
74653               var y = event.transform.y;
74654               var k = event.transform.k;
74655               var isZooming = (k !== tStart.k);
74656               var isPanning = (x !== tStart.x || y !== tStart.y);
74657
74658               if (!isZooming && !isPanning) {
74659                   return;  // no change
74660               }
74661
74662               // lock in either zooming or panning, don't allow both in minimap.
74663               if (!gesture) {
74664                   gesture = isZooming ? 'zoom' : 'pan';
74665               }
74666
74667               var tMini = projection.transform();
74668               var tX, tY, scale;
74669
74670               if (gesture === 'zoom') {
74671                   var dMini = utilGetDimensions(wrap);
74672                   var cMini = geoVecScale(dMini, 0.5);
74673                   scale = k / tMini.k;
74674                   tX = (cMini[0] / scale - cMini[0]) * scale;
74675                   tY = (cMini[1] / scale - cMini[1]) * scale;
74676               } else {
74677                   k = tMini.k;
74678                   scale = 1;
74679                   tX = x - tMini.x;
74680                   tY = y - tMini.y;
74681               }
74682
74683               utilSetTransform(tiles, tX, tY, scale);
74684               utilSetTransform(viewport, 0, 0, scale);
74685               isTransformed = true;
74686               tCurr = identity$7.translate(x, y).scale(k);
74687
74688               var zMain = geoScaleToZoom(context.projection.scale());
74689               var zMini = geoScaleToZoom(k);
74690
74691               zDiff = zMain - zMini;
74692
74693               queueRedraw();
74694           }
74695
74696
74697           function zoomEnded() {
74698               if (skipEvents) return;
74699               if (gesture !== 'pan') return;
74700
74701               updateProjection();
74702               gesture = null;
74703               var dMini = utilGetDimensions(wrap);
74704               var cMini = geoVecScale(dMini, 0.5);
74705               context.map().center(projection.invert(cMini));   // recenter main map..
74706           }
74707
74708
74709           function updateProjection() {
74710               var loc = context.map().center();
74711               var dMini = utilGetDimensions(wrap);
74712               var cMini = geoVecScale(dMini, 0.5);
74713               var tMain = context.projection.transform();
74714               var zMain = geoScaleToZoom(tMain.k);
74715               var zMini = Math.max(zMain - zDiff, 0.5);
74716               var kMini = geoZoomToScale(zMini);
74717
74718               projection
74719                   .translate([tMain.x, tMain.y])
74720                   .scale(kMini);
74721
74722               var point = projection(loc);
74723               var mouse = (gesture === 'pan') ? geoVecSubtract([tCurr.x, tCurr.y], [tStart.x, tStart.y]) : [0, 0];
74724               var xMini = cMini[0] - point[0] + tMain.x + mouse[0];
74725               var yMini = cMini[1] - point[1] + tMain.y + mouse[1];
74726
74727               projection
74728                   .translate([xMini, yMini])
74729                   .clipExtent([[0, 0], dMini]);
74730
74731               tCurr = projection.transform();
74732
74733               if (isTransformed) {
74734                   utilSetTransform(tiles, 0, 0);
74735                   utilSetTransform(viewport, 0, 0);
74736                   isTransformed = false;
74737               }
74738
74739               zoom
74740                   .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
74741
74742               skipEvents = true;
74743               wrap.call(zoom.transform, tCurr);
74744               skipEvents = false;
74745           }
74746
74747
74748           function redraw() {
74749               clearTimeout(timeoutId);
74750               if (isHidden) return;
74751
74752               updateProjection();
74753
74754               var dMini = utilGetDimensions(wrap);
74755               var zMini = geoScaleToZoom(projection.scale());
74756
74757               // setup tile container
74758               tiles = wrap
74759                   .selectAll('.map-in-map-tiles')
74760                   .data([0]);
74761
74762               tiles = tiles.enter()
74763                   .append('div')
74764                   .attr('class', 'map-in-map-tiles')
74765                   .merge(tiles);
74766
74767               // redraw background
74768               backgroundLayer
74769                   .source(context.background().baseLayerSource())
74770                   .projection(projection)
74771                   .dimensions(dMini);
74772
74773               var background = tiles
74774                   .selectAll('.map-in-map-background')
74775                   .data([0]);
74776
74777               background.enter()
74778                   .append('div')
74779                   .attr('class', 'map-in-map-background')
74780                   .merge(background)
74781                   .call(backgroundLayer);
74782
74783
74784               // redraw overlay
74785               var overlaySources = context.background().overlayLayerSources();
74786               var activeOverlayLayers = [];
74787               for (var i = 0; i < overlaySources.length; i++) {
74788                   if (overlaySources[i].validZoom(zMini)) {
74789                       if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
74790                       activeOverlayLayers.push(overlayLayers[i]
74791                           .source(overlaySources[i])
74792                           .projection(projection)
74793                           .dimensions(dMini));
74794                   }
74795               }
74796
74797               var overlay = tiles
74798                   .selectAll('.map-in-map-overlay')
74799                   .data([0]);
74800
74801               overlay = overlay.enter()
74802                   .append('div')
74803                   .attr('class', 'map-in-map-overlay')
74804                   .merge(overlay);
74805
74806
74807               var overlays = overlay
74808                   .selectAll('div')
74809                   .data(activeOverlayLayers, function(d) { return d.source().name(); });
74810
74811               overlays.exit()
74812                   .remove();
74813
74814               overlays = overlays.enter()
74815                   .append('div')
74816                   .merge(overlays)
74817                   .each(function(layer) { select(this).call(layer); });
74818
74819
74820               var dataLayers = tiles
74821                   .selectAll('.map-in-map-data')
74822                   .data([0]);
74823
74824               dataLayers.exit()
74825                   .remove();
74826
74827               dataLayers = dataLayers.enter()
74828                   .append('svg')
74829                   .attr('class', 'map-in-map-data')
74830                   .merge(dataLayers)
74831                   .call(dataLayer)
74832                   .call(debugLayer);
74833
74834
74835               // redraw viewport bounding box
74836               if (gesture !== 'pan') {
74837                   var getPath = d3_geoPath(projection);
74838                   var bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
74839
74840                   viewport = wrap.selectAll('.map-in-map-viewport')
74841                       .data([0]);
74842
74843                   viewport = viewport.enter()
74844                       .append('svg')
74845                       .attr('class', 'map-in-map-viewport')
74846                       .merge(viewport);
74847
74848
74849                   var path = viewport.selectAll('.map-in-map-bbox')
74850                       .data([bbox]);
74851
74852                   path.enter()
74853                       .append('path')
74854                       .attr('class', 'map-in-map-bbox')
74855                       .merge(path)
74856                       .attr('d', getPath)
74857                       .classed('thick', function(d) { return getPath.area(d) < 30; });
74858               }
74859           }
74860
74861
74862           function queueRedraw() {
74863               clearTimeout(timeoutId);
74864               timeoutId = setTimeout(function() { redraw(); }, 750);
74865           }
74866
74867
74868           function toggle() {
74869               if (event) event.preventDefault();
74870
74871               isHidden = !isHidden;
74872
74873               select('.minimap-toggle-item')
74874                   .classed('active', !isHidden)
74875                   .select('input')
74876                   .property('checked', !isHidden);
74877
74878               if (isHidden) {
74879                   wrap
74880                       .style('display', 'block')
74881                       .style('opacity', '1')
74882                       .transition()
74883                       .duration(200)
74884                       .style('opacity', '0')
74885                       .on('end', function() {
74886                           selection.selectAll('.map-in-map')
74887                               .style('display', 'none');
74888                       });
74889               } else {
74890                   wrap
74891                       .style('display', 'block')
74892                       .style('opacity', '0')
74893                       .transition()
74894                       .duration(200)
74895                       .style('opacity', '1')
74896                       .on('end', function() {
74897                           redraw();
74898                       });
74899               }
74900           }
74901
74902
74903           uiMapInMap.toggle = toggle;
74904
74905           wrap = selection.selectAll('.map-in-map')
74906               .data([0]);
74907
74908           wrap = wrap.enter()
74909               .append('div')
74910               .attr('class', 'map-in-map')
74911               .style('display', (isHidden ? 'none' : 'block'))
74912               .call(zoom)
74913               .on('dblclick.zoom', null)
74914               .merge(wrap);
74915
74916           context.map()
74917               .on('drawn.map-in-map', function(drawn) {
74918                   if (drawn.full === true) {
74919                       redraw();
74920                   }
74921               });
74922
74923           redraw();
74924
74925           context.keybinding()
74926               .on(t('background.minimap.key'), toggle);
74927       }
74928
74929       return map_in_map;
74930   }
74931
74932   function uiSettingsCustomBackground(context) {
74933       var dispatch$1 = dispatch('change');
74934
74935       function render(selection) {
74936           var _origSettings = {
74937               template: context.storage('background-custom-template')
74938           };
74939           var _currSettings = cloneDeep(_origSettings);
74940           var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
74941           var modal = uiConfirm(selection).okButton();
74942
74943           modal
74944               .classed('settings-modal settings-custom-background', true);
74945
74946           modal.select('.modal-section.header')
74947               .append('h3')
74948               .text(t('settings.custom_background.header'));
74949
74950
74951           var textSection = modal.select('.modal-section.message-text');
74952
74953           textSection
74954               .append('pre')
74955               .attr('class', 'instructions-template')
74956               .text(t('settings.custom_background.instructions', { example: example }));
74957
74958           textSection
74959               .append('textarea')
74960               .attr('class', 'field-template')
74961               .attr('placeholder', t('settings.custom_background.template.placeholder'))
74962               .call(utilNoAuto)
74963               .property('value', _currSettings.template);
74964
74965
74966           // insert a cancel button
74967           var buttonSection = modal.select('.modal-section.buttons');
74968
74969           buttonSection
74970               .insert('button', '.ok-button')
74971               .attr('class', 'button cancel-button secondary-action')
74972               .text(t('confirm.cancel'));
74973
74974
74975           buttonSection.select('.cancel-button')
74976               .on('click.cancel', clickCancel);
74977
74978           buttonSection.select('.ok-button')
74979               .attr('disabled', isSaveDisabled)
74980               .on('click.save', clickSave);
74981
74982
74983           function isSaveDisabled() {
74984               return null;
74985           }
74986
74987
74988           // restore the original template
74989           function clickCancel() {
74990               textSection.select('.field-template').property('value', _origSettings.template);
74991               context.storage('background-custom-template', _origSettings.template);
74992               this.blur();
74993               modal.close();
74994           }
74995
74996           // accept the current template
74997           function clickSave() {
74998               _currSettings.template = textSection.select('.field-template').property('value');
74999               context.storage('background-custom-template', _currSettings.template);
75000               this.blur();
75001               modal.close();
75002               dispatch$1.call('change', this, _currSettings);
75003           }
75004       }
75005
75006       return utilRebind(render, dispatch$1, 'on');
75007   }
75008
75009   function uiBackground(context) {
75010       var key = t('background.key');
75011
75012       var _pane = select(null), _toggleButton = select(null);
75013
75014       var _customSource = context.background().findSource('custom');
75015       var _previousBackground = context.background().findSource(context.storage('background-last-used-toggle'));
75016       var _shown = false;
75017
75018       var _backgroundList = select(null);
75019       var _overlayList = select(null);
75020       var _displayOptionsContainer = select(null);
75021       var _offsetContainer = select(null);
75022
75023       var backgroundDisplayOptions = uiBackgroundDisplayOptions(context);
75024       var backgroundOffset = uiBackgroundOffset(context);
75025
75026       var settingsCustomBackground = uiSettingsCustomBackground(context)
75027           .on('change', customChanged);
75028
75029
75030       function setTooltips(selection) {
75031           selection.each(function(d, i, nodes) {
75032               var item = select(this).select('label');
75033               var span = item.select('span');
75034               var placement = (i < nodes.length / 2) ? 'bottom' : 'top';
75035               var description = d.description();
75036               var isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
75037
75038               item.call(tooltip().destroyAny);
75039
75040               if (d === _previousBackground) {
75041                   item.call(tooltip()
75042                       .placement(placement)
75043                       .html(true)
75044                       .title(function() {
75045                           var tip = '<div>' + t('background.switch') + '</div>';
75046                           return uiTooltipHtml(tip, uiCmd('⌘' + key));
75047                       })
75048                   );
75049               } else if (description || isOverflowing) {
75050                   item.call(tooltip()
75051                       .placement(placement)
75052                       .title(description || d.name())
75053                   );
75054               }
75055           });
75056       }
75057
75058
75059       function updateLayerSelections(selection) {
75060           function active(d) {
75061               return context.background().showsLayer(d);
75062           }
75063
75064           selection.selectAll('li')
75065               .classed('active', active)
75066               .classed('switch', function(d) { return d === _previousBackground; })
75067               .call(setTooltips)
75068               .selectAll('input')
75069               .property('checked', active);
75070       }
75071
75072
75073       function chooseBackground(d) {
75074           if (d.id === 'custom' && !d.template()) {
75075               return editCustom();
75076           }
75077
75078           event.preventDefault();
75079           _previousBackground = context.background().baseLayerSource();
75080           context.storage('background-last-used-toggle', _previousBackground.id);
75081           context.storage('background-last-used', d.id);
75082           context.background().baseLayerSource(d);
75083           _backgroundList.call(updateLayerSelections);
75084           document.activeElement.blur();
75085       }
75086
75087
75088       function customChanged(d) {
75089           if (d && d.template) {
75090               _customSource.template(d.template);
75091               chooseBackground(_customSource);
75092           } else {
75093               _customSource.template('');
75094               chooseBackground(context.background().findSource('none'));
75095           }
75096       }
75097
75098
75099       function editCustom() {
75100           event.preventDefault();
75101           context.container()
75102               .call(settingsCustomBackground);
75103       }
75104
75105
75106       function chooseOverlay(d) {
75107           event.preventDefault();
75108           context.background().toggleOverlayLayer(d);
75109           _overlayList.call(updateLayerSelections);
75110           document.activeElement.blur();
75111       }
75112
75113
75114       function drawListItems(layerList, type, change, filter) {
75115           var sources = context.background()
75116               .sources(context.map().extent())
75117               .filter(filter);
75118
75119           var layerLinks = layerList.selectAll('li')
75120               .data(sources, function(d) { return d.name(); });
75121
75122           layerLinks.exit()
75123               .remove();
75124
75125           var enter = layerLinks.enter()
75126               .append('li')
75127               .classed('layer-custom', function(d) { return d.id === 'custom'; })
75128               .classed('best', function(d) { return d.best(); });
75129
75130           enter.filter(function(d) { return d.id === 'custom'; })
75131               .append('button')
75132               .attr('class', 'layer-browse')
75133               .call(tooltip()
75134                   .title(t('settings.custom_background.tooltip'))
75135                   .placement((textDirection === 'rtl') ? 'right' : 'left')
75136               )
75137               .on('click', editCustom)
75138               .call(svgIcon('#iD-icon-more'));
75139
75140           enter.filter(function(d) { return d.best(); })
75141               .append('div')
75142               .attr('class', 'best')
75143               .call(tooltip()
75144                   .title(t('background.best_imagery'))
75145                   .placement((textDirection === 'rtl') ? 'right' : 'left')
75146               )
75147               .append('span')
75148               .html('&#9733;');
75149
75150           var label = enter
75151               .append('label');
75152
75153           label
75154               .append('input')
75155               .attr('type', type)
75156               .attr('name', 'layers')
75157               .on('change', change);
75158
75159           label
75160               .append('span')
75161               .text(function(d) { return d.name(); });
75162
75163
75164           layerList.selectAll('li')
75165               .sort(sortSources)
75166               .style('display', layerList.selectAll('li').data().length > 0 ? 'block' : 'none');
75167
75168           layerList
75169               .call(updateLayerSelections);
75170
75171
75172           function sortSources(a, b) {
75173               return a.best() && !b.best() ? -1
75174                   : b.best() && !a.best() ? 1
75175                   : d3_descending(a.area(), b.area()) || ascending(a.name(), b.name()) || 0;
75176           }
75177       }
75178
75179
75180       function renderBackgroundList(selection) {
75181
75182           // the background list
75183           var container = selection.selectAll('.layer-background-list')
75184               .data([0]);
75185
75186           _backgroundList = container.enter()
75187               .append('ul')
75188               .attr('class', 'layer-list layer-background-list')
75189               .attr('dir', 'auto')
75190               .merge(container);
75191
75192
75193           // add minimap toggle below list
75194           var minimapEnter = selection.selectAll('.minimap-toggle-list')
75195               .data([0])
75196               .enter()
75197               .append('ul')
75198               .attr('class', 'layer-list minimap-toggle-list')
75199               .append('li')
75200               .attr('class', 'minimap-toggle-item');
75201
75202           var minimapLabelEnter = minimapEnter
75203               .append('label')
75204               .call(tooltip()
75205                   .html(true)
75206                   .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
75207                   .placement('top')
75208               );
75209
75210           minimapLabelEnter
75211               .append('input')
75212               .attr('type', 'checkbox')
75213               .on('change', function() {
75214                   event.preventDefault();
75215                   uiMapInMap.toggle();
75216               });
75217
75218           minimapLabelEnter
75219               .append('span')
75220               .text(t('background.minimap.description'));
75221
75222
75223           // "Info / Report a Problem" link
75224           selection.selectAll('.imagery-faq')
75225               .data([0])
75226               .enter()
75227               .append('div')
75228               .attr('class', 'imagery-faq')
75229               .append('a')
75230               .attr('target', '_blank')
75231               .attr('tabindex', -1)
75232               .call(svgIcon('#iD-icon-out-link', 'inline'))
75233               .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
75234               .append('span')
75235               .text(t('background.imagery_source_faq'));
75236
75237           updateBackgroundList();
75238       }
75239
75240
75241       function renderOverlayList(selection) {
75242           var container = selection.selectAll('.layer-overlay-list')
75243               .data([0]);
75244
75245           _overlayList = container.enter()
75246               .append('ul')
75247               .attr('class', 'layer-list layer-overlay-list')
75248               .attr('dir', 'auto')
75249               .merge(container);
75250
75251           updateOverlayList();
75252       }
75253
75254       function updateBackgroundList() {
75255           _backgroundList
75256               .call(drawListItems, 'radio', chooseBackground, function(d) { return !d.isHidden() && !d.overlay; });
75257       }
75258
75259       function updateOverlayList() {
75260           _overlayList
75261               .call(drawListItems, 'checkbox', chooseOverlay, function(d) { return !d.isHidden() && d.overlay; });
75262       }
75263
75264
75265       function update() {
75266
75267           if (!_pane.select('.disclosure-wrap-background_list').classed('hide')) {
75268               updateBackgroundList();
75269           }
75270
75271           if (!_pane.select('.disclosure-wrap-overlay_list').classed('hide')) {
75272               updateOverlayList();
75273           }
75274
75275           _displayOptionsContainer
75276               .call(backgroundDisplayOptions);
75277
75278           _offsetContainer
75279               .call(backgroundOffset);
75280       }
75281
75282
75283       function quickSwitch() {
75284           if (event) {
75285               event.stopImmediatePropagation();
75286               event.preventDefault();
75287           }
75288           if (_previousBackground) {
75289               chooseBackground(_previousBackground);
75290           }
75291       }
75292
75293       var paneTooltip = tooltip()
75294           .placement((textDirection === 'rtl') ? 'right' : 'left')
75295           .html(true)
75296           .title(uiTooltipHtml(t('background.description'), key));
75297
75298       uiBackground.togglePane = function() {
75299           if (event) event.preventDefault();
75300           paneTooltip.hide(_toggleButton);
75301           uiBackground.setVisible(!_toggleButton.classed('active'));
75302       };
75303
75304       uiBackground.hidePane = function() {
75305           uiBackground.setVisible(false);
75306       };
75307
75308       uiBackground.setVisible = function(show) {
75309           if (show !== _shown) {
75310               _toggleButton.classed('active', show);
75311               _shown = show;
75312
75313               if (show) {
75314                   uiHelp.hidePane();
75315                   uiIssues.hidePane();
75316                   uiMapData.hidePane();
75317                   update();
75318
75319                   _pane
75320                       .style('display', 'block')
75321                       .style('right', '-300px')
75322                       .transition()
75323                       .duration(200)
75324                       .style('right', '0px');
75325
75326               } else {
75327                   _pane
75328                       .style('display', 'block')
75329                       .style('right', '0px')
75330                       .transition()
75331                       .duration(200)
75332                       .style('right', '-300px')
75333                       .on('end', function() {
75334                           select(this).style('display', 'none');
75335                       });
75336               }
75337           }
75338       };
75339
75340       uiBackground.renderToggleButton = function(selection) {
75341
75342           _toggleButton = selection
75343               .append('button')
75344               .attr('tabindex', -1)
75345               .on('click', uiBackground.togglePane)
75346               .call(svgIcon('#iD-icon-layers', 'light'))
75347               .call(paneTooltip);
75348       };
75349
75350       uiBackground.renderPane = function(selection) {
75351
75352           _pane = selection
75353               .append('div')
75354               .attr('class', 'fillL map-pane background-pane hide');
75355
75356
75357           var heading = _pane
75358               .append('div')
75359               .attr('class', 'pane-heading');
75360
75361           heading
75362               .append('h2')
75363               .text(t('background.title'));
75364
75365           heading
75366               .append('button')
75367               .on('click', uiBackground.hidePane)
75368               .call(svgIcon('#iD-icon-close'));
75369
75370
75371           var content = _pane
75372               .append('div')
75373               .attr('class', 'pane-content');
75374
75375           // background list
75376           content
75377               .append('div')
75378               .attr('class', 'background-background-list-container')
75379               .call(uiDisclosure(context, 'background_list', true)
75380                   .title(t('background.backgrounds'))
75381                   .content(renderBackgroundList)
75382               );
75383
75384           // overlay list
75385           content
75386               .append('div')
75387               .attr('class', 'background-overlay-list-container')
75388               .call(uiDisclosure(context, 'overlay_list', true)
75389                   .title(t('background.overlays'))
75390                   .content(renderOverlayList)
75391               );
75392
75393           // display options
75394           _displayOptionsContainer = content
75395               .append('div')
75396               .attr('class', 'background-display-options');
75397
75398           // offset controls
75399           _offsetContainer = content
75400               .append('div')
75401               .attr('class', 'background-offset');
75402
75403
75404           // add listeners
75405           context.map()
75406               .on('move.background-update', debounce(utilCallWhenIdle(update), 1000));
75407
75408           context.background()
75409               .on('change.background-update', update);
75410
75411
75412           update();
75413
75414           context.keybinding()
75415               .on(key, uiBackground.togglePane)
75416               .on(uiCmd('⌘' + key), quickSwitch);
75417       };
75418
75419       return uiBackground;
75420   }
75421
75422   function uiContributors(context) {
75423       var osm = context.connection(),
75424           debouncedUpdate = debounce(function() { update(); }, 1000),
75425           limit = 4,
75426           hidden = false,
75427           wrap = select(null);
75428
75429
75430       function update() {
75431           if (!osm) return;
75432
75433           var users = {},
75434               entities = context.intersects(context.map().extent());
75435
75436           entities.forEach(function(entity) {
75437               if (entity && entity.user) users[entity.user] = true;
75438           });
75439
75440           var u = Object.keys(users),
75441               subset = u.slice(0, u.length > limit ? limit - 1 : limit);
75442
75443           wrap.html('')
75444               .call(svgIcon('#iD-icon-nearby', 'pre-text light'));
75445
75446           var userList = select(document.createElement('span'));
75447
75448           userList.selectAll()
75449               .data(subset)
75450               .enter()
75451               .append('a')
75452               .attr('class', 'user-link')
75453               .attr('href', function(d) { return osm.userURL(d); })
75454               .attr('target', '_blank')
75455               .attr('tabindex', -1)
75456               .text(String);
75457
75458           if (u.length > limit) {
75459               var count = select(document.createElement('span'));
75460
75461               count.append('a')
75462                   .attr('target', '_blank')
75463                   .attr('tabindex', -1)
75464                   .attr('href', function() {
75465                       return osm.changesetsURL(context.map().center(), context.map().zoom());
75466                   })
75467                   .text(u.length - limit + 1);
75468
75469               wrap.append('span')
75470                   .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
75471
75472           } else {
75473               wrap.append('span')
75474                   .html(t('contributors.list', { users: userList.html() }));
75475           }
75476
75477           if (!u.length) {
75478               hidden = true;
75479               wrap
75480                   .transition()
75481                   .style('opacity', 0);
75482
75483           } else if (hidden) {
75484               wrap
75485                   .transition()
75486                   .style('opacity', 1);
75487           }
75488       }
75489
75490
75491       return function(selection) {
75492           if (!osm) return;
75493           wrap = selection;
75494           update();
75495
75496           osm.on('loaded.contributors', debouncedUpdate);
75497           context.map().on('move.contributors', debouncedUpdate);
75498       };
75499   }
75500
75501   function uiFeatureInfo(context) {
75502       function update(selection) {
75503           var features = context.features(),
75504               stats = features.stats(),
75505               count = 0,
75506               hiddenList = compact(map$3(features.hidden(), function(k) {
75507                   if (stats[k]) {
75508                       count += stats[k];
75509                       return String(stats[k]) + ' ' + t('feature.' + k + '.description');
75510                   }
75511               }));
75512
75513           selection.html('');
75514
75515           if (hiddenList.length) {
75516               var tooltipBehavior = tooltip()
75517                   .placement('top')
75518                   .html(true)
75519                   .title(function() {
75520                       return uiTooltipHtml(hiddenList.join('<br/>'));
75521                   });
75522
75523               var warning = selection.append('a')
75524                   .attr('href', '#')
75525                   .attr('tabindex', -1)
75526                   .html(t('feature_info.hidden_warning', { count: count }))
75527                   .call(tooltipBehavior)
75528                   .on('click', function() {
75529                       tooltipBehavior.hide(warning);
75530                       // open map data panel?
75531                       event.preventDefault();
75532                   });
75533           }
75534
75535           selection
75536               .classed('hide', !hiddenList.length);
75537       }
75538
75539
75540       return function(selection) {
75541           update(selection);
75542
75543           context.features().on('change.feature_info', function() {
75544               update(selection);
75545           });
75546       };
75547   }
75548
75549   function uiFullScreen(context) {
75550       var element = context.container().node();
75551       // var button = d3_select(null);
75552
75553
75554       function getFullScreenFn() {
75555           if (element.requestFullscreen) {
75556               return element.requestFullscreen;
75557           } else if (element.msRequestFullscreen) {
75558               return element.msRequestFullscreen;
75559           } else if (element.mozRequestFullScreen) {
75560               return element.mozRequestFullScreen;
75561           } else if (element.webkitRequestFullscreen) {
75562               return element.webkitRequestFullscreen;
75563           }
75564       }
75565
75566
75567       function getExitFullScreenFn() {
75568           if (document.exitFullscreen) {
75569               return document.exitFullscreen;
75570           } else if (document.msExitFullscreen) {
75571               return document.msExitFullscreen;
75572           } else if (document.mozCancelFullScreen) {
75573               return document.mozCancelFullScreen;
75574           } else if (document.webkitExitFullscreen) {
75575               return document.webkitExitFullscreen;
75576           }
75577       }
75578
75579
75580       function isFullScreen() {
75581           return document.fullscreenElement ||
75582               document.mozFullScreenElement ||
75583               document.webkitFullscreenElement ||
75584               document.msFullscreenElement;
75585       }
75586
75587
75588       function isSupported() {
75589           return !!getFullScreenFn();
75590       }
75591
75592
75593       function fullScreen() {
75594           event.preventDefault();
75595           if (!isFullScreen()) {
75596               // button.classed('active', true);
75597               getFullScreenFn().apply(element);
75598           } else {
75599               // button.classed('active', false);
75600               getExitFullScreenFn().apply(document);
75601           }
75602       }
75603
75604
75605       return function() { // selection) {
75606           if (!isSupported()) return;
75607
75608           // button = selection.append('button')
75609           //     .attr('title', t('full_screen'))
75610           //     .attr('tabindex', -1)
75611           //     .on('click', fullScreen)
75612           //     .call(tooltip);
75613
75614           // button.append('span')
75615           //     .attr('class', 'icon full-screen');
75616
75617           var detected = utilDetect();
75618           var keys = (detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11']);
75619           context.keybinding().on(keys, fullScreen);
75620       };
75621   }
75622
75623   function uiLoading(context) {
75624       var _modalSelection = select(null);
75625       var _message = '';
75626       var _blocking = false;
75627
75628
75629       var loading = function(selection) {
75630           _modalSelection = uiModal(selection, _blocking);
75631
75632           var loadertext = _modalSelection.select('.content')
75633               .classed('loading-modal', true)
75634               .append('div')
75635               .attr('class', 'modal-section fillL');
75636
75637           loadertext
75638               .append('img')
75639               .attr('class', 'loader')
75640               .attr('src', context.imagePath('loader-white.gif'));
75641
75642           loadertext
75643               .append('h3')
75644               .text(_message);
75645
75646           _modalSelection.select('button.close')
75647               .attr('class', 'hide');
75648
75649           return loading;
75650       };
75651
75652
75653       loading.message = function(_) {
75654           if (!arguments.length) return _message;
75655           _message = _;
75656           return loading;
75657       };
75658
75659
75660       loading.blocking = function(_) {
75661           if (!arguments.length) return _blocking;
75662           _blocking = _;
75663           return loading;
75664       };
75665
75666
75667       loading.close = function() {
75668           _modalSelection.remove();
75669       };
75670
75671
75672       return loading;
75673   }
75674
75675   function uiGeolocate(context) {
75676       var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ };
75677       var locating = uiLoading(context).message(t('geolocate.locating')).blocking(true);
75678       var layer = context.layers().layer('geolocate');
75679       var _position;
75680       var _extent;
75681       var _timeoutID;
75682
75683
75684       function click() {
75685           if (context.inIntro()) return;
75686           context.enter(modeBrowse(context));
75687           if (!layer.enabled()) {
75688               if (!_position) {
75689                   context.container().call(locating);
75690                   navigator.geolocation.getCurrentPosition(success, error, geoOptions);
75691               } else {
75692                   zoomTo();
75693               }
75694           } else {
75695               layer.enabled(null, false);
75696           }
75697           // This timeout ensures that we still call finish() even if
75698           // the user declines to share their location in Firefox
75699           _timeoutID = setTimeout(finish, 10000 /* 10sec */ );
75700       }
75701
75702       function zoomTo() {
75703           var map = context.map();
75704           layer.enabled(_position, true);
75705           map.centerZoomEase(_extent.center(), Math.min(20, map.extentZoom(_extent)));
75706       }
75707
75708
75709       function success(geolocation) {
75710           _position = geolocation;
75711           var coords = _position.coords;
75712           _extent = geoExtent([coords.longitude, coords.latitude]).padByMeters(coords.accuracy);
75713           zoomTo();
75714           finish();
75715       }
75716
75717
75718       function error() {
75719           finish();
75720       }
75721
75722
75723       function finish() {
75724           locating.close();  // unblock ui
75725           if (_timeoutID) { clearTimeout(_timeoutID); }
75726           _timeoutID = undefined;
75727       }
75728
75729
75730       return function(selection) {
75731           if (!navigator.geolocation) return;
75732
75733           selection
75734               .append('button')
75735               .attr('tabindex', -1)
75736               .attr('title', t('geolocate.title'))
75737               .on('click', click)
75738               .call(svgIcon('#iD-icon-geolocate', 'light'))
75739               .call(tooltip()
75740                   .placement((textDirection === 'rtl') ? 'right' : 'left'));
75741       };
75742   }
75743
75744   function uiPanelBackground(context) {
75745       var background = context.background();
75746       var currSourceName = null;
75747       var metadata = {};
75748       var metadataKeys = [
75749           'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
75750       ];
75751
75752       var debouncedRedraw = debounce(redraw, 250);
75753
75754       function redraw(selection) {
75755           var source = background.baseLayerSource();
75756           var isDG = (source.id.match(/^DigitalGlobe/i) !== null);
75757
75758           if (currSourceName !== source.name()) {
75759               currSourceName = source.name();
75760               metadata = {};
75761           }
75762
75763           selection.html('');
75764
75765           var list = selection
75766               .append('ul')
75767               .attr('class', 'background-info');
75768
75769           list
75770               .append('li')
75771               .text(currSourceName);
75772
75773           metadataKeys.forEach(function(k) {
75774               // DigitalGlobe vintage is available in raster layers for now.
75775               if (isDG && k === 'vintage') return;
75776
75777               list
75778                   .append('li')
75779                   .attr('class', 'background-info-list-' + k)
75780                   .classed('hide', !metadata[k])
75781                   .text(t('info_panels.background.' + k) + ':')
75782                   .append('span')
75783                   .attr('class', 'background-info-span-' + k)
75784                   .text(metadata[k]);
75785           });
75786
75787           debouncedGetMetadata(selection);
75788
75789           var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
75790
75791           selection
75792               .append('a')
75793               .text(t('info_panels.background.' + toggleTiles))
75794               .attr('href', '#')
75795               .attr('class', 'button button-toggle-tiles')
75796               .on('click', function() {
75797                   event.preventDefault();
75798                   context.setDebug('tile', !context.getDebug('tile'));
75799                   selection.call(redraw);
75800               });
75801
75802           if (isDG) {
75803               var key = source.id + '-vintage';
75804               var sourceVintage = context.background().findSource(key);
75805               var showsVintage = context.background().showsLayer(sourceVintage);
75806               var toggleVintage = showsVintage ? 'hide_vintage' : 'show_vintage';
75807               selection
75808                   .append('a')
75809                   .text(t('info_panels.background.' + toggleVintage))
75810                   .attr('href', '#')
75811                   .attr('class', 'button button-toggle-vintage')
75812                   .on('click', function() {
75813                       event.preventDefault();
75814                       context.background().toggleOverlayLayer(sourceVintage);
75815                       selection.call(redraw);
75816                   });
75817           }
75818
75819           // disable if necessary
75820           ['DigitalGlobe-Premium', 'DigitalGlobe-Standard'].forEach(function(layerId) {
75821               if (source.id !== layerId) {
75822                   var key = layerId + '-vintage';
75823                   var sourceVintage = context.background().findSource(key);
75824                   if (context.background().showsLayer(sourceVintage)) {
75825                       context.background().toggleOverlayLayer(sourceVintage);
75826                   }
75827               }
75828           });
75829       }
75830
75831
75832       var debouncedGetMetadata = debounce(getMetadata, 250);
75833
75834       function getMetadata(selection) {
75835           var tile = select('.layer-background img.tile-center');   // tile near viewport center
75836           if (tile.empty()) return;
75837
75838           var sourceName = currSourceName,
75839               d = tile.datum(),
75840               zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom()),
75841               center = context.map().center();
75842
75843           // update zoom
75844           metadata.zoom = String(zoom);
75845           selection.selectAll('.background-info-list-zoom')
75846               .classed('hide', false)
75847               .selectAll('.background-info-span-zoom')
75848               .text(metadata.zoom);
75849
75850           if (!d || !d.length >= 3) return;
75851
75852           background.baseLayerSource().getMetadata(center, d, function(err, result) {
75853               if (err || currSourceName !== sourceName) return;
75854
75855               // update vintage
75856               var vintage = result.vintage;
75857               metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
75858               selection.selectAll('.background-info-list-vintage')
75859                   .classed('hide', false)
75860                   .selectAll('.background-info-span-vintage')
75861                   .text(metadata.vintage);
75862
75863               // update other metdata
75864               without(metadataKeys, 'zoom', 'vintage')
75865                   .forEach(function(k) {
75866                       var val = result[k];
75867                       metadata[k] = val;
75868                       selection.selectAll('.background-info-list-' + k)
75869                           .classed('hide', !val)
75870                           .selectAll('.background-info-span-' + k)
75871                           .text(val);
75872                   });
75873           });
75874       }
75875
75876
75877       var panel = function(selection) {
75878           selection.call(redraw);
75879
75880           context.map()
75881               .on('drawn.info-background', function() {
75882                   selection.call(debouncedRedraw);
75883               })
75884               .on('move.info-background', function() {
75885                   selection.call(debouncedGetMetadata);
75886               });
75887
75888       };
75889
75890       panel.off = function() {
75891           context.map()
75892               .on('drawn.info-background', null)
75893               .on('move.info-background', null);
75894       };
75895
75896       panel.id = 'background';
75897       panel.title = t('info_panels.background.title');
75898       panel.key = t('info_panels.background.key');
75899
75900
75901       return panel;
75902   }
75903
75904   function uiPanelHistory(context) {
75905       var osm;
75906
75907       function displayTimestamp(timestamp) {
75908           if (!timestamp) return t('info_panels.history.unknown');
75909           var detected = utilDetect();
75910           var options = {
75911               day: 'numeric', month: 'short', year: 'numeric',
75912               hour: 'numeric', minute: 'numeric', second: 'numeric'
75913           };
75914           var d = new Date(timestamp);
75915           if (isNaN(d.getTime())) return t('info_panels.history.unknown');
75916           return d.toLocaleString(detected.locale, options);
75917       }
75918
75919
75920       function displayUser(selection, userName) {
75921           if (!userName) {
75922               selection
75923                   .append('span')
75924                   .text(t('info_panels.history.unknown'));
75925               return;
75926           }
75927
75928           selection
75929               .append('span')
75930               .attr('class', 'user-name')
75931               .text(userName);
75932
75933           var links = selection
75934               .append('div')
75935               .attr('class', 'links');
75936
75937           if (osm) {
75938               links
75939                   .append('a')
75940                   .attr('class', 'user-osm-link')
75941                   .attr('href', osm.userURL(userName))
75942                   .attr('target', '_blank')
75943                   .attr('tabindex', -1)
75944                   .text('OSM');
75945           }
75946
75947           links
75948               .append('a')
75949               .attr('class', 'user-hdyc-link')
75950               .attr('href', 'https://hdyc.neis-one.org/?' + userName)
75951               .attr('target', '_blank')
75952               .attr('tabindex', -1)
75953               .text('HDYC');
75954       }
75955
75956
75957       function displayChangeset(selection, changeset) {
75958           if (!changeset) {
75959               selection
75960                   .append('span')
75961                   .text(t('info_panels.history.unknown'));
75962               return;
75963           }
75964
75965           selection
75966               .append('span')
75967               .attr('class', 'changeset-id')
75968               .text(changeset);
75969
75970           var links = selection
75971               .append('div')
75972               .attr('class', 'links');
75973
75974           if (osm) {
75975               links
75976                   .append('a')
75977                   .attr('class', 'changeset-osm-link')
75978                   .attr('href', osm.changesetURL(changeset))
75979                   .attr('target', '_blank')
75980                   .attr('tabindex', -1)
75981                   .text('OSM');
75982           }
75983
75984           links
75985               .append('a')
75986               .attr('class', 'changeset-osmcha-link')
75987               .attr('href', 'https://osmcha.mapbox.com/changesets/' + changeset)
75988               .attr('target', '_blank')
75989               .attr('tabindex', -1)
75990               .text('OSMCha');
75991       }
75992
75993
75994       function redraw(selection) {
75995           var selectedNoteID = context.selectedNoteID();
75996           osm = context.connection();
75997
75998           var selected, note, entity;
75999           if (selectedNoteID && osm) {       // selected 1 note
76000               selected = [ t('note.note') + ' ' + selectedNoteID ];
76001               note = osm.getNote(selectedNoteID);
76002           } else {                           // selected 1..n entities
76003               selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
76004               if (selected.length) {
76005                   entity = context.entity(selected[0]);
76006               }
76007           }
76008
76009           var singular = selected.length === 1 ? selected[0] : null;
76010
76011           selection.html('');
76012
76013           selection
76014               .append('h4')
76015               .attr('class', 'history-heading')
76016               .text(singular || t('info_panels.history.selected', { n: selected.length }));
76017
76018           if (!singular) return;
76019
76020           if (entity) {
76021               selection.call(redrawEntity, entity);
76022           } else if (note) {
76023               selection.call(redrawNote, note);
76024           }
76025       }
76026
76027
76028       function redrawNote(selection, note) {
76029           if (!note || note.isNew()) {
76030               selection
76031                   .append('div')
76032                   .text(t('info_panels.history.note_no_history'));
76033               return;
76034           }
76035
76036           var list = selection
76037               .append('ul');
76038
76039           list
76040               .append('li')
76041               .text(t('info_panels.history.note_comments') + ':')
76042               .append('span')
76043               .text(note.comments.length);
76044
76045           if (note.comments.length) {
76046               list
76047                   .append('li')
76048                   .text(t('info_panels.history.note_created_date') + ':')
76049                   .append('span')
76050                   .text(displayTimestamp(note.comments[0].date));
76051
76052               list
76053                   .append('li')
76054                   .text(t('info_panels.history.note_created_user') + ':')
76055                   .call(displayUser, note.comments[0].user);
76056           }
76057
76058           if (osm) {
76059               selection
76060                   .append('a')
76061                   .attr('class', 'view-history-on-osm')
76062                   .attr('target', '_blank')
76063                   .attr('tabindex', -1)
76064                   .attr('href', osm.noteURL(note))
76065                   .call(svgIcon('#iD-icon-out-link', 'inline'))
76066                   .append('span')
76067                   .text(t('info_panels.history.note_link_text'));
76068           }
76069       }
76070
76071
76072       function redrawEntity(selection, entity) {
76073           if (!entity || entity.isNew()) {
76074               selection
76075                   .append('div')
76076                   .text(t('info_panels.history.no_history'));
76077               return;
76078           }
76079
76080           var list = selection
76081               .append('ul');
76082
76083           list
76084               .append('li')
76085               .text(t('info_panels.history.version') + ':')
76086               .append('span')
76087               .text(entity.version);
76088
76089           list
76090               .append('li')
76091               .text(t('info_panels.history.last_edit') + ':')
76092               .append('span')
76093               .text(displayTimestamp(entity.timestamp));
76094
76095           list
76096               .append('li')
76097               .text(t('info_panels.history.edited_by') + ':')
76098               .call(displayUser, entity.user);
76099
76100           list
76101               .append('li')
76102               .text(t('info_panels.history.changeset') + ':')
76103               .call(displayChangeset, entity.changeset);
76104
76105           if (osm) {
76106               selection
76107                   .append('a')
76108                   .attr('class', 'view-history-on-osm')
76109                   .attr('target', '_blank')
76110                   .attr('tabindex', -1)
76111                   .attr('href', osm.historyURL(entity))
76112                   .call(svgIcon('#iD-icon-out-link', 'inline'))
76113                   .append('span')
76114                   .text(t('info_panels.history.link_text'));
76115           }
76116       }
76117
76118
76119       var panel = function(selection) {
76120           selection.call(redraw);
76121
76122           context.map()
76123               .on('drawn.info-history', function() {
76124                   selection.call(redraw);
76125               });
76126
76127           context
76128               .on('enter.info-history', function() {
76129                   selection.call(redraw);
76130               });
76131       };
76132
76133       panel.off = function() {
76134           context.map().on('drawn.info-history', null);
76135           context.on('enter.info-history', null);
76136       };
76137
76138       panel.id = 'history';
76139       panel.title = t('info_panels.history.title');
76140       panel.key = t('info_panels.history.key');
76141
76142
76143       return panel;
76144   }
76145
76146   var OSM_PRECISION = 7;
76147   var locale$2 = utilDetect().locale;
76148
76149   /**
76150    * Returns a localized representation of the given length measurement.
76151    *
76152    * @param {Number} m area in meters
76153    * @param {Boolean} isImperial true for U.S. customary units; false for metric
76154    */
76155   function displayLength(m, isImperial) {
76156       var d = m * (isImperial ? 3.28084 : 1);
76157       var unit;
76158
76159       if (isImperial) {
76160           if (d >= 5280) {
76161               d /= 5280;
76162               unit = 'miles';
76163           } else {
76164               unit = 'feet';
76165           }
76166       } else {
76167           if (d >= 1000) {
76168               d /= 1000;
76169               unit = 'kilometers';
76170           } else {
76171               unit = 'meters';
76172           }
76173       }
76174
76175       return t('units.' + unit, {
76176           quantity: d.toLocaleString(locale$2, {
76177               maximumSignificantDigits: 4
76178           })
76179       });
76180   }
76181
76182   /**
76183    * Returns a localized representation of the given area measurement.
76184    *
76185    * @param {Number} m2 area in square meters
76186    * @param {Boolean} isImperial true for U.S. customary units; false for metric
76187    */
76188   function displayArea(m2, isImperial) {
76189       var d = m2 * (isImperial ? 10.7639111056 : 1);
76190       var d1, d2, area;
76191       var unit1 = '';
76192       var unit2 = '';
76193
76194       if (isImperial) {
76195           if (d >= 6969600) { // > 0.25mi² show mi²
76196               d1 = d / 27878400;
76197               unit1 = 'square_miles';
76198           } else {
76199               d1 = d;
76200               unit1 = 'square_feet';
76201           }
76202
76203           if (d > 4356 && d < 43560000) { // 0.1 - 1000 acres
76204               d2 = d / 43560;
76205               unit2 = 'acres';
76206           }
76207
76208       } else {
76209           if (d >= 250000) { // > 0.25km² show km²
76210               d1 = d / 1000000;
76211               unit1 = 'square_kilometers';
76212           } else {
76213               d1 = d;
76214               unit1 = 'square_meters';
76215           }
76216
76217           if (d > 1000 && d < 10000000) { // 0.1 - 1000 hectares
76218               d2 = d / 10000;
76219               unit2 = 'hectares';
76220           }
76221       }
76222
76223       area = t('units.' + unit1, {
76224           quantity: d1.toLocaleString(locale$2, {
76225               maximumSignificantDigits: 4
76226           })
76227       });
76228
76229       if (d2) {
76230           return t('units.area_pair', {
76231               area1: area,
76232               area2: t('units.' + unit2, {
76233                   quantity: d2.toLocaleString(locale$2, {
76234                       maximumSignificantDigits: 2
76235                   })
76236               })
76237           });
76238       } else {
76239           return area;
76240       }
76241   }
76242
76243   function wrap(x, min, max) {
76244       var d = max - min;
76245       return ((x - min) % d + d) % d + min;
76246   }
76247
76248   function clamp$1(x, min, max) {
76249       return Math.max(min, Math.min(x, max));
76250   }
76251
76252   function displayCoordinate(deg, pos, neg) {
76253       var min = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60;
76254       var sec = (min - Math.floor(min)) * 60;
76255       var displayDegrees = t('units.arcdegrees', {
76256           quantity: Math.floor(Math.abs(deg)).toLocaleString(locale$2)
76257       });
76258       var displayCoordinate;
76259
76260       if (Math.floor(sec) > 0) {
76261           displayCoordinate = displayDegrees +
76262               t('units.arcminutes', {
76263                   quantity: Math.floor(min).toLocaleString(locale$2)
76264               }) +
76265               t('units.arcseconds', {
76266                   quantity: Math.round(sec).toLocaleString(locale$2)
76267               });
76268       } else if (Math.floor(min) > 0) {
76269           displayCoordinate = displayDegrees +
76270               t('units.arcminutes', {
76271                   quantity: Math.round(min).toLocaleString(locale$2)
76272               });
76273       } else {
76274           displayCoordinate = t('units.arcdegrees', {
76275               quantity: Math.round(Math.abs(deg)).toLocaleString(locale$2)
76276           });
76277       }
76278
76279       if (deg === 0) {
76280           return displayCoordinate;
76281       } else {
76282           return t('units.coordinate', {
76283               coordinate: displayCoordinate,
76284               direction: t('units.' + (deg > 0 ? pos : neg))
76285           });
76286       }
76287   }
76288
76289   /**
76290    * Returns given coordinate pair in degree-minute-second format.
76291    *
76292    * @param {Array<Number>} coord longitude and latitude
76293    */
76294   function dmsCoordinatePair(coord) {
76295       return t('units.coordinate_pair', {
76296           latitude: displayCoordinate(clamp$1(coord[1], -90, 90), 'north', 'south'),
76297           longitude: displayCoordinate(wrap(coord[0], -180, 180), 'east', 'west')
76298       });
76299   }
76300
76301   /**
76302    * Returns the given coordinate pair in decimal format.
76303    * note: unlocalized to avoid comma ambiguity - see #4765
76304    *
76305    * @param {Array<Number>} coord longitude and latitude
76306    */
76307   function decimalCoordinatePair(coord) {
76308       return t('units.coordinate_pair', {
76309           latitude: clamp$1(coord[1], -90, 90).toFixed(OSM_PRECISION),
76310           longitude: wrap(coord[0], -180, 180).toFixed(OSM_PRECISION)
76311       });
76312   }
76313
76314   function uiPanelLocation(context) {
76315       var currLocation = '';
76316
76317
76318       function redraw(selection) {
76319           selection.html('');
76320
76321           var list = selection
76322               .append('ul');
76323
76324           // Mouse coordinates
76325           var coord = context.map().mouseCoordinates();
76326           if (coord.some(isNaN)) {
76327               coord = context.map().center();
76328           }
76329
76330           list
76331               .append('li')
76332               .text(dmsCoordinatePair(coord))
76333               .append('li')
76334               .text(decimalCoordinatePair(coord));
76335
76336           // Location Info
76337           selection
76338               .append('div')
76339               .attr('class', 'location-info')
76340               .text(currLocation || ' ');
76341
76342           debouncedGetLocation(selection, coord);
76343       }
76344
76345
76346       var debouncedGetLocation = debounce(getLocation, 250);
76347       function getLocation(selection, coord) {
76348           if (!services.geocoder) {
76349               currLocation = t('info_panels.location.unknown_location');
76350               selection.selectAll('.location-info')
76351                   .text(currLocation);
76352           } else {
76353               services.geocoder.reverse(coord, function(err, result) {
76354                   currLocation = result ? result.display_name : t('info_panels.location.unknown_location');
76355                   selection.selectAll('.location-info')
76356                       .text(currLocation);
76357               });
76358           }
76359       }
76360
76361
76362       var panel = function(selection) {
76363           selection.call(redraw);
76364
76365           context.surface()
76366               .on('mousemove.info-location', function() {
76367                   selection.call(redraw);
76368               });
76369       };
76370
76371       panel.off = function() {
76372           context.surface()
76373               .on('mousemove.info-location', null);
76374       };
76375
76376       panel.id = 'location';
76377       panel.title = t('info_panels.location.title');
76378       panel.key = t('info_panels.location.key');
76379
76380
76381       return panel;
76382   }
76383
76384   function uiPanelMeasurement(context) {
76385       var locale = utilDetect().locale,
76386           isImperial = (locale.toLowerCase() === 'en-us');
76387
76388
76389       function radiansToMeters(r) {
76390           // using WGS84 authalic radius (6371007.1809 m)
76391           return r * 6371007.1809;
76392       }
76393
76394       function steradiansToSqmeters(r) {
76395           // http://gis.stackexchange.com/a/124857/40446
76396           return r / (4 * Math.PI) * 510065621724000;
76397       }
76398
76399
76400       function toLineString(feature) {
76401           if (feature.type === 'LineString') return feature;
76402
76403           var result = { type: 'LineString', coordinates: [] };
76404           if (feature.type === 'Polygon') {
76405               result.coordinates = feature.coordinates[0];
76406           } else if (feature.type === 'MultiPolygon') {
76407               result.coordinates = feature.coordinates[0][0];
76408           }
76409
76410           return result;
76411       }
76412
76413
76414       function nodeCount(feature) {
76415         if (feature.type === 'LineString') return feature.coordinates.length;
76416         if (feature.type === 'Polygon') return feature.coordinates[0].length - 1;
76417       }
76418
76419
76420       function redraw(selection) {
76421           var resolver = context.graph();
76422           var selectedNoteID = context.selectedNoteID();
76423           var osm = services.osm;
76424
76425           var selected, center, entity, note, geometry;
76426
76427           if (selectedNoteID && osm) {       // selected 1 note
76428               selected = [ t('note.note') + ' ' + selectedNoteID ];
76429               note = osm.getNote(selectedNoteID);
76430               center = note.loc;
76431               geometry = 'note';
76432
76433           } else {                           // selected 1..n entities
76434               var extent = geoExtent();
76435               selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
76436               if (selected.length) {
76437                   for (var i = 0; i < selected.length; i++) {
76438                       entity = context.entity(selected[i]);
76439                       extent._extend(entity.extent(resolver));
76440                   }
76441                   center = extent.center();
76442                   geometry = entity.geometry(resolver);
76443               }
76444           }
76445
76446           var singular = selected.length === 1 ? selected[0] : null;
76447
76448           selection.html('');
76449
76450           selection
76451               .append('h4')
76452               .attr('class', 'measurement-heading')
76453               .text(singular || t('info_panels.measurement.selected', { n: selected.length.toLocaleString(locale) }));
76454
76455           if (!selected.length) return;
76456
76457
76458           var list = selection
76459               .append('ul');
76460           var coordItem;
76461
76462           // multiple selected features, just display extent center..
76463           if (!singular) {
76464               coordItem = list
76465                   .append('li')
76466                   .text(t('info_panels.measurement.center') + ':');
76467               coordItem.append('span')
76468                   .text(dmsCoordinatePair(center));
76469               coordItem.append('span')
76470                   .text(decimalCoordinatePair(center));
76471               return;
76472           }
76473
76474           // single selected feature, display details..
76475           if (geometry === 'line' || geometry === 'area') {
76476               var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate());
76477               var feature = entity.asGeoJSON(resolver);
76478               var length = radiansToMeters(length$1(toLineString(feature)));
76479               var lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length'));
76480               var centroid = d3_geoCentroid(feature);
76481
76482               list
76483                   .append('li')
76484                   .text(t('info_panels.measurement.geometry') + ':')
76485                   .append('span')
76486                   .text(
76487                       closed ? t('info_panels.measurement.closed_' + geometry) : t('geometry.' + geometry)
76488                   );
76489
76490               if (entity.type !== 'relation') {
76491                   list
76492                       .append('li')
76493                       .text(t('info_panels.measurement.node_count') + ':')
76494                       .append('span')
76495                       .text(nodeCount(feature).toLocaleString(locale));
76496               }
76497
76498               if (closed) {
76499                   var area = steradiansToSqmeters(entity.area(resolver));
76500                   list
76501                       .append('li')
76502                       .text(t('info_panels.measurement.area') + ':')
76503                       .append('span')
76504                       .text(displayArea(area, isImperial));
76505               }
76506
76507
76508               list
76509                   .append('li')
76510                   .text(lengthLabel + ':')
76511                   .append('span')
76512                   .text(displayLength(length, isImperial));
76513
76514               coordItem = list
76515                   .append('li')
76516                   .text(t('info_panels.measurement.centroid') + ':');
76517               coordItem.append('span')
76518                   .text(dmsCoordinatePair(centroid));
76519               coordItem.append('span')
76520                   .text(decimalCoordinatePair(centroid));
76521
76522               var toggle  = isImperial ? 'imperial' : 'metric';
76523
76524               selection
76525                   .append('a')
76526                   .text(t('info_panels.measurement.' + toggle))
76527                   .attr('href', '#')
76528                   .attr('class', 'button button-toggle-units')
76529                   .on('click', function() {
76530                       event.preventDefault();
76531                       isImperial = !isImperial;
76532                       selection.call(redraw);
76533                   });
76534
76535           } else {
76536               var centerLabel = t('info_panels.measurement.' +
76537                   (note || entity.type === 'node' ? 'location' : 'center'));
76538
76539               list
76540                   .append('li')
76541                   .text(t('info_panels.measurement.geometry') + ':')
76542                   .append('span')
76543                   .text(t('geometry.' + geometry));
76544
76545               coordItem = list
76546                   .append('li')
76547                   .text(centerLabel + ':');
76548               coordItem.append('span')
76549                   .text(dmsCoordinatePair(center));
76550               coordItem.append('span')
76551                   .text(decimalCoordinatePair(center));
76552           }
76553       }
76554
76555
76556       var panel = function(selection) {
76557           selection.call(redraw);
76558
76559           context.map()
76560               .on('drawn.info-measurement', function() {
76561                   selection.call(redraw);
76562               });
76563
76564           context
76565               .on('enter.info-measurement', function() {
76566                   selection.call(redraw);
76567               });
76568       };
76569
76570       panel.off = function() {
76571           context.map().on('drawn.info-measurement', null);
76572           context.on('enter.info-measurement', null);
76573       };
76574
76575       panel.id = 'measurement';
76576       panel.title = t('info_panels.measurement.title');
76577       panel.key = t('info_panels.measurement.key');
76578
76579
76580       return panel;
76581   }
76582
76583   var uiInfoPanels = {
76584       background: uiPanelBackground,
76585       history: uiPanelHistory,
76586       location: uiPanelLocation,
76587       measurement: uiPanelMeasurement,
76588   };
76589
76590   function uiInfo(context) {
76591       var ids = Object.keys(uiInfoPanels);
76592       var wasActive = ['measurement'];
76593       var panels = {};
76594       var active = {};
76595
76596       // create panels
76597       ids.forEach(function(k) {
76598           if (!panels[k]) {
76599               panels[k] = uiInfoPanels[k](context);
76600               active[k] = false;
76601           }
76602       });
76603
76604
76605       function info(selection) {
76606
76607           function redraw() {
76608               var activeids = ids.filter(function(k) { return active[k]; }).sort();
76609
76610               var containers = infoPanels.selectAll('.panel-container')
76611                   .data(activeids, function(k) { return k; });
76612
76613               containers.exit()
76614                   .style('opacity', 1)
76615                   .transition()
76616                   .duration(200)
76617                   .style('opacity', 0)
76618                   .on('end', function(d) {
76619                       select(this)
76620                           .call(panels[d].off)
76621                           .remove();
76622                   });
76623
76624               var enter = containers.enter()
76625                   .append('div')
76626                   .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
76627
76628               enter
76629                   .style('opacity', 0)
76630                   .transition()
76631                   .duration(200)
76632                   .style('opacity', 1);
76633
76634               var title = enter
76635                   .append('div')
76636                   .attr('class', 'panel-title fillD2');
76637
76638               title
76639                   .append('h3')
76640                   .text(function(d) { return panels[d].title; });
76641
76642               title
76643                   .append('button')
76644                   .attr('class', 'close')
76645                   .on('click', function (d) { toggle(d); })
76646                   .call(svgIcon('#iD-icon-close'));
76647
76648               enter
76649                   .append('div')
76650                   .attr('class', function(d) { return 'panel-content panel-content-' + d; });
76651
76652
76653               // redraw the panels
76654               infoPanels.selectAll('.panel-content')
76655                   .each(function(d) {
76656                       select(this).call(panels[d]);
76657                   });
76658           }
76659
76660
76661           function toggle(which) {
76662               if (event) {
76663                   event.stopImmediatePropagation();
76664                   event.preventDefault();
76665               }
76666
76667               var activeids = ids.filter(function(k) { return active[k]; });
76668
76669               if (which) {  // toggle one
76670                   active[which] = !active[which];
76671                   if (activeids.length === 1 && activeids[0] === which) {  // none active anymore
76672                       wasActive = [which];
76673                   }
76674               } else {      // toggle all
76675                   if (activeids.length) {
76676                       wasActive = activeids;
76677                       activeids.forEach(function(k) { active[k] = false; });
76678                   } else {
76679                       wasActive.forEach(function(k) { active[k] = true; });
76680                   }
76681               }
76682
76683               redraw();
76684           }
76685
76686
76687           var infoPanels = selection.selectAll('.info-panels')
76688               .data([0]);
76689
76690           infoPanels = infoPanels.enter()
76691               .append('div')
76692               .attr('class', 'info-panels')
76693               .merge(infoPanels);
76694
76695           redraw();
76696
76697           context.keybinding()
76698               .on(uiCmd('⌘' + t('info_panels.key')), toggle);
76699
76700           ids.forEach(function(k) {
76701               var key = t('info_panels.' + k + '.key', { default: null });
76702               if (!key) return;
76703               context.keybinding()
76704                   .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
76705           });
76706       }
76707
76708       return info;
76709   }
76710
76711   function uiModes(context) {
76712       var modes = [
76713           modeAddPoint(context),
76714           modeAddLine(context),
76715           modeAddArea(context),
76716           modeAddNote(context)
76717       ];
76718
76719
76720       function enabled(d) {
76721           if (d.id === 'add-note') {
76722               return notesEnabled() && notesEditable();
76723           } else {
76724               return osmEditable();
76725           }
76726       }
76727
76728       function osmEditable() {
76729           var mode = context.mode();
76730           return context.editable() && mode && mode.id !== 'save';
76731       }
76732
76733       function notesEnabled() {
76734           var noteLayer = context.layers().layer('notes');
76735           return noteLayer && noteLayer.enabled();
76736       }
76737
76738       function notesEditable() {
76739           var mode = context.mode();
76740           return context.map().notesEditable() && mode && mode.id !== 'save';
76741       }
76742
76743
76744       return function(selection) {
76745           context
76746               .on('enter.editor', function(entered) {
76747                   selection.selectAll('button.add-button')
76748                       .classed('active', function(mode) { return entered.button === mode.button; });
76749                   context.container()
76750                       .classed('mode-' + entered.id, true);
76751               });
76752
76753           context
76754               .on('exit.editor', function(exited) {
76755                   context.container()
76756                       .classed('mode-' + exited.id, false);
76757               });
76758
76759           modes.forEach(function(mode) {
76760               context.keybinding().on(mode.key, function() {
76761                   if (!enabled(mode)) return;
76762
76763                   if (mode.id === context.mode().id) {
76764                       context.enter(modeBrowse(context));
76765                   } else {
76766                       context.enter(mode);
76767                   }
76768               });
76769           });
76770
76771
76772           var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
76773
76774           context.map()
76775               .on('move.modes', debouncedUpdate)
76776               .on('drawn.modes', debouncedUpdate);
76777
76778           context
76779               .on('enter.modes', update);
76780
76781           update();
76782
76783
76784           function update() {
76785               var showNotes = notesEnabled();
76786               var data = showNotes ? modes : modes.slice(0, 3);
76787
76788               var buttons = selection.selectAll('button.add-button')
76789                   .data(data, function(d) { return d.id; });
76790
76791               // exit
76792               buttons.exit()
76793                   .remove();
76794
76795               // enter
76796               var buttonsEnter = buttons.enter()
76797                   .append('button')
76798                   .attr('tabindex', -1)
76799                   .attr('class', function(d) { return d.id + ' add-button'; })
76800                   .on('click.mode-buttons', function(d) {
76801                       if (!enabled(d)) return;
76802
76803                       // When drawing, ignore accidental clicks on mode buttons - #4042
76804                       var currMode = context.mode().id;
76805                       if (/^draw/.test(currMode)) return;
76806
76807                       if (d.id === currMode) {
76808                           context.enter(modeBrowse(context));
76809                       } else {
76810                           context.enter(d);
76811                       }
76812                   })
76813                   .call(tooltip()
76814                       .placement('bottom')
76815                       .html(true)
76816                       .title(function(d) { return uiTooltipHtml(d.description, d.key); })
76817                   );
76818
76819               buttonsEnter
76820                   .each(function(d) {
76821                       select(this)
76822                           .call(svgIcon('#iD-icon-' + d.button));
76823                   });
76824
76825               buttonsEnter
76826                   .append('span')
76827                   .attr('class', 'label')
76828                   .text(function(mode) { return mode.title; });
76829
76830               // if we are adding/removing the buttons, check if toolbar has overflowed
76831               if (buttons.enter().size() || buttons.exit().size()) {
76832                   context.ui().checkOverflow('#bar', true);
76833               }
76834
76835               // update
76836               buttons = buttons
76837                   .merge(buttonsEnter)
76838                   .classed('disabled', function(d) { return !enabled(d); });
76839           }
76840       };
76841   }
76842
76843   function uiNotice(context) {
76844
76845       return function(selection) {
76846           var div = selection
76847               .append('div')
76848               .attr('class', 'notice');
76849
76850           var button = div
76851               .append('button')
76852               .attr('class', 'zoom-to notice fillD')
76853               .on('click', function() {
76854                   context.map().zoomEase(context.minEditableZoom());
76855               })
76856               .on('wheel', function() {   // let wheel events pass through #4482
76857                   var e2 = new WheelEvent(event.type, event);
76858                   context.surface().node().dispatchEvent(e2);
76859               });
76860
76861           button
76862               .call(svgIcon('#iD-icon-plus', 'pre-text'))
76863               .append('span')
76864               .attr('class', 'label')
76865               .text(t('zoom_in_edit'));
76866
76867
76868           function disableTooHigh() {
76869               var canEdit = context.map().zoom() >= context.minEditableZoom();
76870               div.style('display', canEdit ? 'none' : 'block');
76871           }
76872
76873           context.map()
76874               .on('move.notice', debounce(disableTooHigh, 500));
76875
76876           disableTooHigh();
76877       };
76878   }
76879
76880   function uiPhotoviewer(context) {
76881
76882       var dispatch$1 = dispatch('resize');
76883
76884       function photoviewer(selection) {
76885           selection
76886               .append('button')
76887               .attr('class', 'thumb-hide')
76888               .on('click', function () {
76889                   if (services.streetside) { services.streetside.hideViewer(); }
76890                   if (services.mapillary) { services.mapillary.hideViewer(); }
76891                   if (services.openstreetcam) { services.openstreetcam.hideViewer(); }
76892               })
76893               .append('div')
76894               .call(svgIcon('#iD-icon-close'));
76895
76896           selection
76897               .append('button')
76898               .attr('class', 'resize-handle-xy')
76899               .on(
76900                   'mousedown',
76901                   buildResizeListener(selection, 'resize', dispatch$1, { resizeOnX: true, resizeOnY: true })
76902               );
76903
76904           selection
76905               .append('button')
76906               .attr('class', 'resize-handle-x')
76907               .on(
76908                   'mousedown',
76909                   buildResizeListener(selection, 'resize', dispatch$1, { resizeOnX: true })
76910               );
76911
76912           selection
76913               .append('button')
76914               .attr('class', 'resize-handle-y')
76915               .on(
76916                   'mousedown',
76917                   buildResizeListener(selection, 'resize', dispatch$1, { resizeOnY: true })
76918               );
76919
76920
76921           function buildResizeListener(target, eventName, dispatch, options) {
76922               var resizeOnX = !!options.resizeOnX;
76923               var resizeOnY = !!options.resizeOnY;
76924               var minHeight = options.minHeight || 240;
76925               var minWidth = options.minWidth || 320;
76926               var startX;
76927               var startY;
76928               var startWidth;
76929               var startHeight;
76930
76931               function startResize() {
76932                   var mapSize = context.map().dimensions();
76933
76934                   if (resizeOnX) {
76935                       var maxWidth = mapSize[0];
76936                       var newWidth = clamp((startWidth + event.clientX - startX), minWidth, maxWidth);
76937                       target.style('width', newWidth + 'px');
76938                   }
76939
76940                   if (resizeOnY) {
76941                       var maxHeight = mapSize[1] - 90;  // preserve space at top/bottom of map
76942                       var newHeight = clamp((startHeight + startY - event.clientY), minHeight, maxHeight);
76943                       target.style('height', newHeight + 'px');
76944                   }
76945
76946                   dispatch.call(eventName, target, utilGetDimensions(target, true));
76947               }
76948
76949               function clamp(num, min, max) {
76950                   return Math.max(min, Math.min(num, max));
76951               }
76952
76953               function stopResize() {
76954                   select(window)
76955                       .on('.' + eventName, null);
76956               }
76957
76958               return function initResize() {
76959                   startX = event.clientX;
76960                   startY = event.clientY;
76961                   startWidth = target.node().getBoundingClientRect().width;
76962                   startHeight = target.node().getBoundingClientRect().height;
76963
76964                   select(window)
76965                       .on('mousemove.' + eventName, startResize, false)
76966                       .on('mouseup.' + eventName, stopResize, false);
76967               };
76968           }
76969       }
76970
76971       photoviewer.onMapResize = function() {
76972           var photoviewer = select('#photoviewer');
76973           var content = select('#content');
76974           var mapDimensions = utilGetDimensions(content, true);
76975           // shrink photo viewer if it is too big
76976           // (-90 preserves space at top and bottom of map used by menus)
76977           var photoDimensions = utilGetDimensions(photoviewer, true);
76978           if (photoDimensions[0] > mapDimensions[0] || photoDimensions[1] > (mapDimensions[1] - 90)) {
76979               var setPhotoDimensions = [
76980                   Math.min(photoDimensions[0], mapDimensions[0]),
76981                   Math.min(photoDimensions[1], mapDimensions[1] - 90),
76982               ];
76983
76984               photoviewer
76985                   .style('width', setPhotoDimensions[0] + 'px')
76986                   .style('height', setPhotoDimensions[1] + 'px');
76987
76988               dispatch$1.call('resize', photoviewer, setPhotoDimensions);
76989           }
76990       };
76991
76992       return utilRebind(photoviewer, dispatch$1, 'on');
76993   }
76994
76995   function uiRestore(context) {
76996
76997       return function(selection) {
76998           if (!context.history().lock() || !context.history().restorableChanges())
76999               return;
77000
77001           var modalSelection = uiModal(selection, true);
77002
77003           modalSelection.select('.modal')
77004               .attr('class', 'modal fillL col6');
77005
77006           var introModal = modalSelection.select('.content');
77007
77008           introModal
77009               .attr('class','cf');
77010
77011           introModal
77012               .append('div')
77013               .attr('class', 'modal-section')
77014               .append('h3')
77015               .text(t('restore.heading'));
77016
77017           introModal
77018               .append('div')
77019               .attr('class','modal-section')
77020               .append('p')
77021               .text(t('restore.description'));
77022
77023           var buttonWrap = introModal
77024               .append('div')
77025               .attr('class', 'modal-actions cf');
77026
77027           var restore = buttonWrap
77028               .append('button')
77029               .attr('class', 'restore col6')
77030               .on('click', function() {
77031                   context.history().restore();
77032                   modalSelection.remove();
77033               });
77034
77035           restore
77036               .append('svg')
77037               .attr('class', 'logo logo-restore')
77038               .append('use')
77039               .attr('xlink:href', '#iD-logo-restore');
77040
77041           restore
77042               .append('div')
77043               .text(t('restore.restore'));
77044
77045           var reset = buttonWrap
77046               .append('button')
77047               .attr('class', 'reset col6')
77048               .on('click', function() {
77049                   context.history().clearSaved();
77050                   modalSelection.remove();
77051               });
77052
77053           reset
77054               .append('svg')
77055               .attr('class', 'logo logo-reset')
77056               .append('use')
77057               .attr('xlink:href', '#iD-logo-reset');
77058
77059           reset
77060               .append('div')
77061               .text(t('restore.reset'));
77062
77063           restore.node().focus();
77064       };
77065   }
77066
77067   function uiSave(context) {
77068       var history = context.history();
77069       var key = uiCmd('⌘S');
77070       var _numChanges = 0;
77071
77072
77073       return function(selection) {
77074
77075
77076           function isSaving() {
77077               var mode = context.mode();
77078               return mode && mode.id === 'save';
77079           }
77080
77081
77082           function isDisabled() {
77083               return _numChanges === 0 || isSaving();
77084           }
77085
77086
77087           function save() {
77088               event.preventDefault();
77089               if (!context.inIntro() && !isSaving() && history.hasChanges()) {
77090                   context.enter(modeSave(context));
77091               }
77092           }
77093
77094
77095           function bgColor() {
77096               var step;
77097               if (_numChanges === 0) {
77098                   return null;
77099               } else if (_numChanges <= 50) {
77100                   step = _numChanges / 50;
77101                   return interpolateRgb('#fff', '#ff8')(step);  // white -> yellow
77102               } else {
77103                   step = Math.min((_numChanges - 50) / 50, 1.0);
77104                   return interpolateRgb('#ff8', '#f88')(step);  // yellow -> red
77105               }
77106           }
77107
77108
77109           function updateCount() {
77110               var val = history.difference().summary().length;
77111               if (val === _numChanges) return;
77112               _numChanges = val;
77113
77114               tooltipBehavior
77115                   .title(uiTooltipHtml(
77116                       t(_numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
77117                   );
77118
77119               button
77120                   .classed('disabled', isDisabled())
77121                   .style('background', bgColor(_numChanges));
77122
77123               button.select('span.count')
77124                   .text(_numChanges);
77125           }
77126
77127
77128           var tooltipBehavior = tooltip()
77129               .placement('bottom')
77130               .html(true)
77131               .title(uiTooltipHtml(t('save.no_changes'), key));
77132
77133           var button = selection
77134               .append('button')
77135               .attr('class', 'save disabled')
77136               .attr('tabindex', -1)
77137               .on('click', save)
77138               .call(tooltipBehavior);
77139
77140           button
77141               .call(svgIcon('#iD-icon-save'));
77142
77143           button
77144               .append('span')
77145               .attr('class', 'label')
77146               .text(t('save.title'));
77147
77148           button
77149               .append('span')
77150               .attr('class', 'count')
77151               .text('0');
77152
77153           updateCount();
77154
77155
77156           context.keybinding()
77157               .on(key, save, true);
77158
77159           context.history()
77160               .on('change.save', updateCount);
77161
77162           context
77163               .on('enter.save', function() {
77164                   button
77165                       .classed('disabled', isDisabled());
77166
77167                   if (isSaving()) {
77168                       button.call(tooltipBehavior.hide);
77169                   }
77170               });
77171       };
77172   }
77173
77174   function uiScale(context) {
77175       var projection = context.projection,
77176           isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
77177           maxLength = 180,
77178           tickHeight = 8;
77179
77180
77181       function scaleDefs(loc1, loc2) {
77182           var lat = (loc2[1] + loc1[1]) / 2,
77183               conversion = (isImperial ? 3.28084 : 1),
77184               dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
77185               scale = { dist: 0, px: 0, text: '' },
77186               buckets, i, val, dLon;
77187
77188           if (isImperial) {
77189               buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
77190           } else {
77191               buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
77192           }
77193
77194           // determine a user-friendly endpoint for the scale
77195           for (i = 0; i < buckets.length; i++) {
77196               val = buckets[i];
77197               if (dist >= val) {
77198                   scale.dist = Math.floor(dist / val) * val;
77199                   break;
77200               } else {
77201                   scale.dist = +dist.toFixed(2);
77202               }
77203           }
77204
77205           dLon = geoMetersToLon(scale.dist / conversion, lat);
77206           scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
77207
77208           scale.text = displayLength(scale.dist / conversion, isImperial);
77209
77210           return scale;
77211       }
77212
77213
77214       function update(selection) {
77215           // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
77216           var dims = context.map().dimensions(),
77217               loc1 = projection.invert([0, dims[1]]),
77218               loc2 = projection.invert([maxLength, dims[1]]),
77219               scale = scaleDefs(loc1, loc2);
77220
77221           selection.select('#scale-path')
77222               .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
77223
77224           selection.select('#scale-textgroup')
77225               .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
77226
77227           selection.select('#scale-text')
77228               .text(scale.text);
77229       }
77230
77231
77232       return function(selection) {
77233           function switchUnits() {
77234               isImperial = !isImperial;
77235               selection.call(update);
77236           }
77237
77238           var scalegroup = selection.append('svg')
77239               .attr('id', 'scale')
77240               .on('click', switchUnits)
77241               .append('g')
77242               .attr('transform', 'translate(10,11)');
77243
77244           scalegroup
77245               .append('path')
77246               .attr('id', 'scale-path');
77247
77248           scalegroup
77249               .append('g')
77250               .attr('id', 'scale-textgroup')
77251               .append('text')
77252               .attr('id', 'scale-text');
77253
77254           selection.call(update);
77255
77256           context.map().on('move.scale', function() {
77257               update(selection);
77258           });
77259       };
77260   }
77261
77262   function uiSidebar(context) {
77263       var inspector = uiInspector(context);
77264       var dataEditor = uiDataEditor(context);
77265       var noteEditor = uiNoteEditor(context);
77266       var improveOsmEditor = uiImproveOsmEditor(context);
77267       var keepRightEditor = uiKeepRightEditor(context);
77268       var _current;
77269       var _wasData = false;
77270       var _wasNote = false;
77271       var _wasQAError = false;
77272
77273
77274       function sidebar(selection) {
77275           var container = select('#id-container');
77276           var minWidth = 280;
77277           var sidebarWidth;
77278           var containerWidth;
77279           var dragOffset;
77280
77281           var resizer = selection
77282               .append('div')
77283               .attr('id', 'sidebar-resizer');
77284
77285           // Set the initial width constraints
77286           selection
77287               .style('min-width', minWidth + 'px')
77288               .style('max-width', '400px')
77289               .style('width', '33.3333%');
77290
77291           resizer.call(d3_drag()
77292               .container(container.node())
77293               .on('start', function() {
77294                   // offset from edge of sidebar-resizer
77295                   dragOffset = event.sourceEvent.offsetX - 1;
77296
77297                   sidebarWidth = selection.node().getBoundingClientRect().width;
77298                   containerWidth = container.node().getBoundingClientRect().width;
77299                   var widthPct = (sidebarWidth / containerWidth) * 100;
77300                   selection
77301                       .style('width', widthPct + '%')    // lock in current width
77302                       .style('max-width', '85%');        // but allow larger widths
77303
77304                   resizer.classed('dragging', true);
77305               })
77306               .on('drag', function() {
77307                   var isRTL = (textDirection === 'rtl');
77308                   var scaleX = isRTL ? 0 : 1;
77309                   var xMarginProperty = isRTL ? 'margin-right' : 'margin-left';
77310
77311                   var x = event.x - dragOffset;
77312                   sidebarWidth = isRTL ? containerWidth - x : x;
77313
77314                   var isCollapsed = selection.classed('collapsed');
77315                   var shouldCollapse = sidebarWidth < minWidth;
77316
77317                   selection.classed('collapsed', shouldCollapse);
77318
77319                   if (shouldCollapse) {
77320                       if (!isCollapsed) {
77321                           selection
77322                               .style(xMarginProperty, '-400px')
77323                               .style('width', '400px');
77324
77325                           context.ui().onResize([(sidebarWidth - event.dx) * scaleX, 0]);
77326                       }
77327
77328                   } else {
77329                       var widthPct = (sidebarWidth / containerWidth) * 100;
77330                       selection
77331                           .style(xMarginProperty, null)
77332                           .style('width', widthPct + '%');
77333
77334                       if (isCollapsed) {
77335                           context.ui().onResize([-sidebarWidth * scaleX, 0]);
77336                       } else {
77337                           context.ui().onResize([-event.dx * scaleX, 0]);
77338                       }
77339                   }
77340               })
77341               .on('end', function() {
77342                   resizer.classed('dragging', false);
77343               })
77344           );
77345
77346           var featureListWrap = selection
77347               .append('div')
77348               .attr('class', 'feature-list-pane')
77349               .call(uiFeatureList(context));
77350
77351           var inspectorWrap = selection
77352               .append('div')
77353               .attr('class', 'inspector-hidden inspector-wrap fr');
77354
77355
77356           function hover(datum) {
77357               if (datum && datum.__featurehash__) {   // hovering on data
77358                   _wasData = true;
77359                   sidebar
77360                       .show(dataEditor.datum(datum));
77361
77362                   selection.selectAll('.sidebar-component')
77363                       .classed('inspector-hover', true);
77364
77365               } else if (datum instanceof osmNote) {
77366                   if (context.mode().id === 'drag-note') return;
77367                   _wasNote = true;
77368
77369                   var osm = services.osm;
77370                   if (osm) {
77371                       datum = osm.getNote(datum.id);   // marker may contain stale data - get latest
77372                   }
77373
77374                   sidebar
77375                       .show(noteEditor.note(datum));
77376
77377                   selection.selectAll('.sidebar-component')
77378                       .classed('inspector-hover', true);
77379
77380               } else if (datum instanceof qaError) {
77381                   _wasQAError = true;
77382
77383                   var errService = services[datum.service];
77384                   if (errService) {
77385                       // marker may contain stale data - get latest
77386                       datum = errService.getError(datum.id);
77387                   }
77388
77389                   // Temporary solution while only two services
77390                   var errEditor = (datum.service === 'keepRight') ? keepRightEditor : improveOsmEditor;
77391
77392                   d3_selectAll('.qa_error.' + datum.service)
77393                       .classed('hover', function(d) { return d.id === datum.id; });
77394
77395                   sidebar
77396                       .show(errEditor.error(datum));
77397
77398                   selection.selectAll('.sidebar-component')
77399                       .classed('inspector-hover', true);
77400
77401               } else if (!_current && (datum instanceof osmEntity)) {
77402                   featureListWrap
77403                       .classed('inspector-hidden', true);
77404
77405                   inspectorWrap
77406                       .classed('inspector-hidden', false)
77407                       .classed('inspector-hover', true);
77408
77409                   if (inspector.entityID() !== datum.id || inspector.state() !== 'hover') {
77410                       inspector
77411                           .state('hover')
77412                           .entityID(datum.id);
77413
77414                       inspectorWrap
77415                           .call(inspector);
77416                   }
77417
77418               } else if (!_current) {
77419                   featureListWrap
77420                       .classed('inspector-hidden', false);
77421                   inspectorWrap
77422                       .classed('inspector-hidden', true);
77423                   inspector
77424                       .state('hide');
77425
77426               } else if (_wasData || _wasNote || _wasQAError) {
77427                   _wasNote = false;
77428                   _wasData = false;
77429                   _wasQAError = false;
77430                   d3_selectAll('.note').classed('hover', false);
77431                   d3_selectAll('.qa_error').classed('hover', false);
77432                   sidebar.hide();
77433               }
77434           }
77435
77436           sidebar.hover = throttle(hover, 200);
77437
77438
77439           sidebar.intersects = function(extent) {
77440               var rect = selection.node().getBoundingClientRect();
77441               return extent.intersects([
77442                   context.projection.invert([0, rect.height]),
77443                   context.projection.invert([rect.width, 0])
77444               ]);
77445           };
77446
77447
77448           sidebar.select = function(id, newFeature) {
77449               sidebar.hide();
77450
77451               if (id) {
77452                   var entity = context.entity(id);
77453                   // uncollapse the sidebar
77454                   if (selection.classed('collapsed')) {
77455                       var extent = entity.extent(context.graph());
77456                       sidebar.expand(sidebar.intersects(extent));
77457                   }
77458
77459                   featureListWrap
77460                       .classed('inspector-hidden', true);
77461
77462                   inspectorWrap
77463                       .classed('inspector-hidden', false)
77464                       .classed('inspector-hover', false);
77465
77466                   if (inspector.entityID() !== id || inspector.state() !== 'select') {
77467                       inspector
77468                           .state('select')
77469                           .entityID(id)
77470                           .newFeature(newFeature);
77471
77472                       inspectorWrap
77473                           .call(inspector, newFeature);
77474                   }
77475
77476                   sidebar.showPresetList = function() {
77477                       inspector.showList(context.presets().match(entity, context.graph()));
77478                   };
77479
77480               } else {
77481                   inspector
77482                       .state('hide');
77483               }
77484           };
77485
77486
77487           sidebar.show = function(component, element) {
77488               featureListWrap
77489                   .classed('inspector-hidden', true);
77490               inspectorWrap
77491                   .classed('inspector-hidden', true);
77492
77493               if (_current) _current.remove();
77494               _current = selection
77495                   .append('div')
77496                   .attr('class', 'sidebar-component')
77497                   .call(component, element);
77498           };
77499
77500
77501           sidebar.hide = function() {
77502               featureListWrap
77503                   .classed('inspector-hidden', false);
77504               inspectorWrap
77505                   .classed('inspector-hidden', true);
77506
77507               if (_current) _current.remove();
77508               _current = null;
77509           };
77510
77511
77512           sidebar.expand = function(moveMap) {
77513               if (selection.classed('collapsed')) {
77514                   sidebar.toggle(moveMap);
77515               }
77516           };
77517
77518
77519           sidebar.collapse = function(moveMap) {
77520               if (!selection.classed('collapsed')) {
77521                   sidebar.toggle(moveMap);
77522               }
77523           };
77524
77525
77526           sidebar.toggle = function(moveMap) {
77527               var e = event;
77528               if (e && e.sourceEvent) {
77529                   e.sourceEvent.preventDefault();
77530               } else if (e) {
77531                   e.preventDefault();
77532               }
77533
77534               // Don't allow sidebar to toggle when the user is in the walkthrough.
77535               if (context.inIntro()) return;
77536
77537               var isCollapsed = selection.classed('collapsed');
77538               var isCollapsing = !isCollapsed;
77539               var isRTL = (textDirection === 'rtl');
77540               var scaleX = isRTL ? 0 : 1;
77541               var xMarginProperty = isRTL ? 'margin-right' : 'margin-left';
77542
77543               sidebarWidth = selection.node().getBoundingClientRect().width;
77544
77545               // switch from % to px
77546               selection.style('width', sidebarWidth + 'px');
77547
77548               var startMargin, endMargin, lastMargin;
77549               if (isCollapsing) {
77550                   startMargin = lastMargin = 0;
77551                   endMargin = -sidebarWidth;
77552               } else {
77553                   startMargin = lastMargin = -sidebarWidth;
77554                   endMargin = 0;
77555               }
77556
77557               selection.transition()
77558                   .style(xMarginProperty, endMargin + 'px')
77559                   .tween('panner', function() {
77560                       var i = interpolateNumber(startMargin, endMargin);
77561                       return function(t) {
77562                           var dx = lastMargin - Math.round(i(t));
77563                           lastMargin = lastMargin - dx;
77564                           context.ui().onResize(moveMap ? undefined : [dx * scaleX, 0]);
77565                       };
77566                   })
77567                   .on('end', function() {
77568                       selection.classed('collapsed', isCollapsing);
77569
77570                       // switch back from px to %
77571                       if (!isCollapsing) {
77572                           var containerWidth = container.node().getBoundingClientRect().width;
77573                           var widthPct = (sidebarWidth / containerWidth) * 100;
77574                           selection
77575                               .style(xMarginProperty, null)
77576                               .style('width', widthPct + '%');
77577                       }
77578                   });
77579           };
77580
77581           // toggle the sidebar collapse when double-clicking the resizer
77582           resizer.on('dblclick', sidebar.toggle);
77583       }
77584
77585       sidebar.showPresetList = function() {};
77586       sidebar.hover = function() {};
77587       sidebar.hover.cancel = function() {};
77588       sidebar.intersects = function() {};
77589       sidebar.select = function() {};
77590       sidebar.show = function() {};
77591       sidebar.hide = function() {};
77592       sidebar.expand = function() {};
77593       sidebar.collapse = function() {};
77594       sidebar.toggle = function() {};
77595
77596       return sidebar;
77597   }
77598
77599   function uiSpinner(context) {
77600       var osm = context.connection();
77601
77602
77603       return function(selection) {
77604           var img = selection
77605               .append('img')
77606               .attr('src', context.imagePath('loader-black.gif'))
77607               .style('opacity', 0);
77608
77609           if (osm) {
77610               osm
77611                   .on('loading.spinner', function() {
77612                       img.transition()
77613                           .style('opacity', 1);
77614                   })
77615                   .on('loaded.spinner', function() {
77616                       img.transition()
77617                           .style('opacity', 0);
77618                   });
77619           }
77620       };
77621   }
77622
77623   function uiSplash(context) {
77624
77625       return function(selection) {
77626           if (context.storage('sawSplash'))
77627                return;
77628
77629           context.storage('sawSplash', true);
77630
77631           var modalSelection = uiModal(selection);
77632
77633           modalSelection.select('.modal')
77634               .attr('class', 'modal-splash modal col6');
77635
77636           var introModal = modalSelection.select('.content')
77637               .append('div')
77638               .attr('class', 'fillL');
77639
77640           introModal
77641               .append('div')
77642               .attr('class','modal-section cf')
77643               .append('h3').text(t('splash.welcome'));
77644
77645           introModal
77646               .append('div')
77647               .attr('class','modal-section')
77648               .append('p')
77649               .html(t('splash.text', {
77650                   version: context.version,
77651                   website: '<a href="http://ideditor.com/">ideditor.com</a>',
77652                   github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
77653               }));
77654
77655           var buttonWrap = introModal
77656               .append('div')
77657               .attr('class', 'modal-actions cf');
77658
77659           var walkthrough = buttonWrap
77660               .append('button')
77661               .attr('class', 'walkthrough col6')
77662               .on('click', function() {
77663                   context.container().call(uiIntro(context));
77664                   modalSelection.close();
77665               });
77666
77667           walkthrough
77668               .append('svg')
77669               .attr('class', 'logo logo-walkthrough')
77670               .append('use')
77671               .attr('xlink:href', '#iD-logo-walkthrough');
77672
77673           walkthrough
77674               .append('div')
77675               .text(t('splash.walkthrough'));
77676
77677           var startEditing = buttonWrap
77678               .append('button')
77679               .attr('class', 'start-editing col6')
77680               .on('click', modalSelection.close);
77681
77682           startEditing
77683               .append('svg')
77684               .attr('class', 'logo logo-features')
77685               .append('use')
77686               .attr('xlink:href', '#iD-logo-features');
77687
77688           startEditing
77689               .append('div')
77690               .text(t('splash.start'));
77691
77692
77693           modalSelection.select('button.close')
77694               .attr('class','hide');
77695
77696       };
77697   }
77698
77699   function uiStatus(context) {
77700       var osm = context.connection();
77701
77702
77703       return function(selection) {
77704           if (!osm) return;
77705
77706           function update() {
77707               osm.status(function(err, apiStatus) {
77708                   selection.html('');
77709
77710                   if (err) {
77711                       if (apiStatus === 'connectionSwitched') {
77712                           // if the connection was just switched, we can't rely on
77713                           // the status (we're getting the status of the previous api)
77714                           return;
77715
77716                       } else if (apiStatus === 'rateLimited') {
77717                           selection
77718                               .text(t('status.rateLimit'))
77719                               .append('a')
77720                               .attr('class', 'api-status-login')
77721                               .attr('target', '_blank')
77722                               .call(svgIcon('#iD-icon-out-link', 'inline'))
77723                               .append('span')
77724                               .text(t('login'))
77725                               .on('click.login', function() {
77726                                   event.preventDefault();
77727                                   osm.authenticate();
77728                               });
77729                       } else {
77730                           // eslint-disable-next-line no-warning-comments
77731                           // TODO: nice messages for different error types
77732                           selection.text(t('status.error'));
77733                       }
77734
77735                   } else if (apiStatus === 'readonly') {
77736                       selection.text(t('status.readonly'));
77737                   } else if (apiStatus === 'offline') {
77738                       selection.text(t('status.offline'));
77739                   }
77740
77741                   selection.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
77742               });
77743           }
77744
77745           osm.on('change', function() { update(selection); });
77746
77747           window.setInterval(update, 90000);
77748           update(selection);
77749       };
77750   }
77751
77752   function uiUndoRedo(context) {
77753       var commands = [{
77754           id: 'undo',
77755           cmd: uiCmd('⌘Z'),
77756           action: function() { if (editable()) context.undo(); },
77757           annotation: function() { return context.history().undoAnnotation(); }
77758       }, {
77759           id: 'redo',
77760           cmd: uiCmd('⌘⇧Z'),
77761           action: function() { if (editable()) context.redo(); },
77762           annotation: function() { return context.history().redoAnnotation(); }
77763       }];
77764
77765
77766       function editable() {
77767           var mode = context.mode();
77768           return context.editable() && mode && mode.id !== 'save';
77769       }
77770
77771
77772       return function(selection) {
77773           var tooltipBehavior = tooltip()
77774               .placement('bottom')
77775               .html(true)
77776               .title(function (d) {
77777                   return uiTooltipHtml(d.annotation() ?
77778                       t(d.id + '.tooltip', {action: d.annotation()}) :
77779                       t(d.id + '.nothing'), d.cmd);
77780               });
77781
77782           var buttons = selection.selectAll('button')
77783               .data(commands)
77784               .enter()
77785               .append('button')
77786               .attr('class', function(d) { return 'disabled ' + d.id + '-button'; })
77787               .on('click', function(d) { return d.action(); })
77788               .call(tooltipBehavior);
77789
77790           buttons.each(function(d) {
77791               var iconName = d.id;
77792               if (textDirection === 'rtl') {
77793                   if (iconName === 'undo') {
77794                       iconName = 'redo';
77795                   } else if (iconName === 'redo') {
77796                       iconName = 'undo';
77797                   }
77798               }
77799               select(this)
77800                   .call(svgIcon('#iD-icon-' + iconName));
77801           });
77802
77803           context.keybinding()
77804               .on(commands[0].cmd, function() { event.preventDefault(); commands[0].action(); })
77805               .on(commands[1].cmd, function() { event.preventDefault(); commands[1].action(); });
77806
77807
77808           var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
77809
77810           context.map()
77811               .on('move.undo_redo', debouncedUpdate)
77812               .on('drawn.undo_redo', debouncedUpdate);
77813
77814           context.history()
77815               .on('change.undo_redo', update);
77816
77817           context
77818               .on('enter.undo_redo', update);
77819
77820
77821           function update() {
77822               buttons
77823                   .property('disabled', !editable())
77824                   .classed('disabled', function(d) { return !d.annotation(); })
77825                   .each(function() {
77826                       var selection = select(this);
77827                       if (selection.property('tooltipVisible')) {
77828                           selection.call(tooltipBehavior.show);
77829                       }
77830                   });
77831           }
77832       };
77833   }
77834
77835   // these are module variables so they are preserved through a ui.restart()
77836   var sawVersion = null;
77837   var isNewVersion = false;
77838   var isNewUser = false;
77839
77840
77841   function uiVersion(context) {
77842
77843       var currVersion = context.version;
77844       var matchedVersion = currVersion.match(/\d+\.\d+\.\d+.*/);
77845
77846       if (sawVersion === null && matchedVersion !== null) {
77847           isNewVersion = (context.storage('sawVersion') !== currVersion);
77848           isNewUser = !context.storage('sawSplash');
77849           context.storage('sawVersion', currVersion);
77850           sawVersion = currVersion;
77851       }
77852
77853       return function(selection) {
77854           selection
77855               .append('a')
77856               .attr('target', '_blank')
77857               .attr('tabindex', -1)
77858               .attr('href', 'https://github.com/openstreetmap/iD')
77859               .text(currVersion);
77860
77861           // only show new version indicator to users that have used iD before
77862           if (isNewVersion && !isNewUser) {
77863               selection
77864                   .append('div')
77865                   .attr('class', 'badge')
77866                   .append('a')
77867                   .attr('target', '_blank')
77868                   .attr('tabindex', -1)
77869                   .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CHANGELOG.md#whats-new')
77870                   .call(svgIcon('#maki-gift-11'))
77871                   .call(tooltip()
77872                       .title(t('version.whats_new', { version: currVersion }))
77873                       .placement('top')
77874                   );
77875           }
77876       };
77877   }
77878
77879   function uiZoom(context) {
77880       var zooms = [{
77881           id: 'zoom-in',
77882           icon: 'plus',
77883           title: t('zoom.in'),
77884           action: context.zoomIn,
77885           key: '+'
77886       }, {
77887           id: 'zoom-out',
77888           icon: 'minus',
77889           title: t('zoom.out'),
77890           action: context.zoomOut,
77891           key: '-'
77892       }];
77893
77894
77895       function zoomIn() {
77896           event.preventDefault();
77897           context.zoomIn();
77898       }
77899
77900
77901       function zoomOut() {
77902           event.preventDefault();
77903           context.zoomOut();
77904       }
77905
77906
77907       function zoomInFurther() {
77908           event.preventDefault();
77909           context.zoomInFurther();
77910       }
77911
77912
77913       function zoomOutFurther() {
77914           event.preventDefault();
77915           context.zoomOutFurther();
77916       }
77917
77918
77919       return function(selection) {
77920           var button = selection.selectAll('button')
77921               .data(zooms)
77922               .enter()
77923               .append('button')
77924               .attr('tabindex', -1)
77925               .attr('class', function(d) { return d.id; })
77926               .on('click.editor', function(d) { d.action(); })
77927               .call(tooltip()
77928                   .placement((textDirection === 'rtl') ? 'right' : 'left')
77929                   .html(true)
77930                   .title(function(d) {
77931                       return uiTooltipHtml(d.title, d.key);
77932                   })
77933               );
77934
77935           button.each(function(d) {
77936               select(this)
77937                   .call(svgIcon('#iD-icon-' + d.icon, 'light'));
77938           });
77939
77940           ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
77941               context.keybinding().on([key], zoomIn);
77942               context.keybinding().on([uiCmd('⌘' + key)], zoomInFurther);
77943           });
77944
77945           ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
77946               context.keybinding().on([key], zoomOut);
77947               context.keybinding().on([uiCmd('⌘' + key)], zoomOutFurther);
77948           });
77949       };
77950   }
77951
77952   function uiInit(context) {
77953       var _initCounter = 0;
77954       var _initCallback;
77955       var _needWidth = {};
77956
77957
77958       function render(container) {
77959           container
77960               .attr('dir', textDirection);
77961
77962           var map = context.map();
77963
77964           container
77965               .append('svg')
77966               .attr('id', 'defs')
77967               .call(svgDefs(context));
77968
77969           container
77970               .append('div')
77971               .attr('id', 'sidebar')
77972               .call(ui.sidebar);
77973
77974           var content = container
77975               .append('div')
77976               .attr('id', 'content')
77977               .attr('class', 'active');
77978
77979           // Top toolbar
77980           var bar = content
77981               .append('div')
77982               .attr('id', 'bar')
77983               .attr('class', 'fillD');
77984
77985           content
77986               .append('div')
77987               .attr('id', 'map')
77988               .attr('dir', 'ltr')
77989               .call(map);
77990
77991           // Leading area button group (Sidebar toggle)
77992           var leadingArea = bar
77993               .append('div')
77994               .attr('class', 'tool-group leading-area');
77995
77996           var sidebarButton = leadingArea
77997               .append('div')
77998               .append('button')
77999               .attr('class', 'sidebar-toggle')
78000               .attr('tabindex', -1)
78001               .on('click', ui.sidebar.toggle)
78002               .call(tooltip()
78003                   .placement('bottom')
78004                   .html(true)
78005                   .title(uiTooltipHtml(t('sidebar.tooltip'), t('sidebar.key')))
78006               );
78007
78008           var iconSuffix = textDirection === 'rtl' ? 'right' : 'left';
78009           sidebarButton
78010               .call(svgIcon('#iD-icon-sidebar-' + iconSuffix));
78011
78012           leadingArea
78013               .append('div')
78014               .attr('class', 'full-screen bar-group')
78015               .call(uiFullScreen(context));
78016
78017
78018           // Center area button group (Point/Line/Area/Note mode buttons)
78019           bar
78020               .append('div')
78021               .attr('class', 'tool-group center-area')
78022               .append('div')
78023               .attr('class', 'modes joined')
78024               .call(uiModes(context), bar);
78025
78026
78027           // Trailing area button group (Undo/Redo save buttons)
78028           var trailingArea = bar
78029               .append('div')
78030               .attr('class', 'tool-group trailing-area');
78031
78032           trailingArea
78033               .append('div')
78034               .attr('class', 'joined')
78035               .call(uiUndoRedo(context));
78036
78037           trailingArea
78038               .append('div')
78039               .attr('class', 'save-wrap')
78040               .call(uiSave(context));
78041
78042
78043           // For now, just put spinner at the end of the #bar
78044           bar
78045               .append('div')
78046               .attr('class', 'spinner')
78047               .call(uiSpinner(context));
78048
78049
78050           // Map controls (appended to #bar, but absolutely positioned)
78051           var controls = content
78052               .append('div')
78053               .attr('class', 'map-controls');
78054
78055           controls
78056               .append('div')
78057               .attr('class', 'map-control zoombuttons')
78058               .call(uiZoom(context));
78059
78060           controls
78061               .append('div')
78062               .attr('class', 'map-control geolocate-control')
78063               .call(uiGeolocate(context));
78064
78065           var background = uiBackground(context);
78066           controls
78067               .append('div')
78068               .attr('class', 'map-control background-control')
78069               .call(background.renderToggleButton);
78070           content.call(background.renderPane);
78071
78072           var mapData = uiMapData(context);
78073           controls
78074               .append('div')
78075               .attr('class', 'map-control map-data-control')
78076               .call(mapData.renderToggleButton);
78077           content.call(mapData.renderPane);
78078
78079           var issues = uiIssues(context);
78080           controls
78081               .append('div')
78082               .attr('class', 'map-control map-issues-control')
78083               .call(issues.renderToggleButton);
78084           content.call(issues.renderPane);
78085
78086           var help = uiHelp(context);
78087           controls
78088               .append('div')
78089               .attr('class', 'map-control help-control')
78090               .call(help.renderToggleButton);
78091           content.call(help.renderPane);
78092
78093
78094           // Add attribution and footer
78095           var about = content
78096               .append('div')
78097               .attr('id', 'about');
78098
78099           about
78100               .append('div')
78101               .attr('id', 'attrib')
78102               .attr('dir', 'ltr')
78103               .call(uiAttribution(context));
78104
78105           about
78106               .append('div')
78107               .attr('class', 'api-status')
78108               .call(uiStatus(context));
78109
78110
78111           var footer = about
78112               .append('div')
78113               .attr('id', 'footer')
78114               .attr('class', 'fillD');
78115
78116           footer
78117               .append('div')
78118               .attr('id', 'flash-wrap')
78119               .attr('class', 'footer-hide');
78120
78121           var footerWrap = footer
78122               .append('div')
78123               .attr('id', 'footer-wrap')
78124               .attr('class', 'footer-show');
78125
78126           footerWrap
78127               .append('div')
78128               .attr('id', 'scale-block')
78129               .call(uiScale(context));
78130
78131           var aboutList = footerWrap
78132               .append('div')
78133               .attr('id', 'info-block')
78134               .append('ul')
78135               .attr('id', 'about-list');
78136
78137           if (!context.embed()) {
78138               aboutList
78139                   .call(uiAccount(context));
78140           }
78141
78142           aboutList
78143               .append('li')
78144               .attr('class', 'version')
78145               .call(uiVersion(context));
78146
78147           var issueLinks = aboutList
78148               .append('li');
78149
78150           issueLinks
78151               .append('a')
78152               .attr('target', '_blank')
78153               .attr('tabindex', -1)
78154               .attr('href', 'https://github.com/openstreetmap/iD/issues')
78155               .call(svgIcon('#iD-icon-bug', 'light'))
78156               .call(tooltip().title(t('report_a_bug')).placement('top'));
78157
78158           issueLinks
78159               .append('a')
78160               .attr('target', '_blank')
78161               .attr('tabindex', -1)
78162               .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
78163               .call(svgIcon('#iD-icon-translate', 'light'))
78164               .call(tooltip().title(t('help_translate')).placement('top'));
78165
78166           aboutList
78167               .append('li')
78168               .attr('class', 'feature-warning')
78169               .attr('tabindex', -1)
78170               .call(uiFeatureInfo(context));
78171
78172           aboutList
78173               .append('li')
78174               .attr('class', 'user-list')
78175               .attr('tabindex', -1)
78176               .call(uiContributors(context));
78177
78178
78179           // Setup map dimensions and move map to initial center/zoom.
78180           // This should happen after #content and toolbars exist.
78181           ui.onResize();
78182
78183           var hash = behaviorHash(context);
78184           hash();
78185           if (!hash.hadHash) {
78186               map.centerZoom([0, 0], 2);
78187           }
78188
78189
78190           // Add absolutely-positioned elements that sit on top of the map
78191           // This should happen after the map is ready (center/zoom)
78192           content
78193               .call(uiMapInMap(context))
78194               .call(uiInfo(context))
78195               .call(uiNotice(context));
78196
78197           content
78198               .append('div')
78199               .attr('id', 'photoviewer')
78200               .classed('al', true)       // 'al'=left,  'ar'=right
78201               .classed('hide', true)
78202               .call(ui.photoviewer);
78203
78204
78205           // Bind events
78206           window.onbeforeunload = function() {
78207               return context.save();
78208           };
78209           window.onunload = function() {
78210               context.history().unlock();
78211           };
78212
78213           select(window)
78214               .on('gesturestart.editor', eventCancel)
78215               .on('gesturechange.editor', eventCancel)
78216               .on('gestureend.editor', eventCancel)
78217               .on('resize.editor', ui.onResize);
78218
78219
78220           var panPixels = 80;
78221           context.keybinding()
78222               .on('⌫', function() { event.preventDefault(); })
78223               .on([t('sidebar.key'), '`', '²'], ui.sidebar.toggle)   // #5663 - common QWERTY, AZERTY
78224               .on('←', pan([panPixels, 0]))
78225               .on('↑', pan([0, panPixels]))
78226               .on('→', pan([-panPixels, 0]))
78227               .on('↓', pan([0, -panPixels]))
78228               .on(['⇧←', uiCmd('⌘←')], pan([map.dimensions()[0], 0]))
78229               .on(['⇧↑', uiCmd('⌘↑')], pan([0, map.dimensions()[1]]))
78230               .on(['⇧→', uiCmd('⌘→')], pan([-map.dimensions()[0], 0]))
78231               .on(['⇧↓', uiCmd('⌘↓')], pan([0, -map.dimensions()[1]]));
78232
78233           context.enter(modeBrowse(context));
78234
78235           if (!_initCounter++) {
78236               if (!hash.startWalkthrough) {
78237                   context.container()
78238                       .call(uiSplash(context))
78239                       .call(uiRestore(context));
78240               }
78241
78242               context.container()
78243                   .call(uiShortcuts(context));
78244           }
78245
78246           var osm = context.connection();
78247           var auth = uiLoading(context).message(t('loading_auth')).blocking(true);
78248
78249           if (osm && auth) {
78250               osm
78251                   .on('authLoading.ui', function() {
78252                       context.container()
78253                           .call(auth);
78254                   })
78255                   .on('authDone.ui', function() {
78256                       auth.close();
78257                   });
78258           }
78259
78260           _initCounter++;
78261
78262           if (hash.startWalkthrough) {
78263               hash.startWalkthrough = false;
78264               context.container().call(uiIntro(context));
78265           }
78266
78267
78268           function pan(d) {
78269               return function() {
78270                   if (select('.combobox').size()) return;
78271                   event.preventDefault();
78272                   context.pan(d, 100);
78273               };
78274           }
78275
78276           function eventCancel() {
78277               event.preventDefault();
78278           }
78279       }
78280
78281
78282       function ui(node, callback) {
78283           _initCallback = callback;
78284           var container = select(node);
78285           context.container(container);
78286           context.loadLocale(function(err) {
78287               if (!err) {
78288                   render(container);
78289               }
78290               if (callback) {
78291                   callback(err);
78292               }
78293           });
78294       }
78295
78296
78297       ui.restart = function(arg) {
78298           context.keybinding().clear();
78299           context.locale(arg);
78300           context.loadLocale(function(err) {
78301               if (!err) {
78302                   context.container().selectAll('*').remove();
78303                   render(context.container());
78304                   if (_initCallback) _initCallback();
78305               }
78306           });
78307       };
78308
78309
78310       ui.sidebar = uiSidebar(context);
78311
78312       ui.photoviewer = uiPhotoviewer(context);
78313
78314       ui.onResize = function(withPan) {
78315           var map = context.map();
78316
78317           // Recalc dimensions of map and sidebar.. (`true` = force recalc)
78318           // This will call `getBoundingClientRect` and trigger reflow,
78319           //  but the values will be cached for later use.
78320           var mapDimensions = utilGetDimensions(select('#content'), true);
78321           utilGetDimensions(select('#sidebar'), true);
78322
78323           if (withPan !== undefined) {
78324               map.redrawEnable(false);
78325               map.pan(withPan);
78326               map.redrawEnable(true);
78327           }
78328           map.dimensions(mapDimensions);
78329
78330           ui.photoviewer.onMapResize();
78331
78332           // check if header or footer have overflowed
78333           ui.checkOverflow('#bar');
78334           ui.checkOverflow('#footer');
78335
78336           // Use outdated code so it works on Explorer
78337           var resizeWindowEvent = document.createEvent('Event');
78338
78339           resizeWindowEvent.initEvent('resizeWindow', true, true);
78340
78341           document.dispatchEvent(resizeWindowEvent);
78342       };
78343
78344
78345       // Call checkOverflow when resizing or whenever the contents change.
78346       ui.checkOverflow = function(selector, reset) {
78347           if (reset) {
78348               delete _needWidth[selector];
78349           }
78350
78351           var element = select(selector);
78352           var scrollWidth = element.property('scrollWidth');
78353           var clientWidth = element.property('clientWidth');
78354           var needed = _needWidth[selector] || scrollWidth;
78355
78356           if (scrollWidth > clientWidth) {    // overflow happening
78357               element.classed('narrow', true);
78358               if (!_needWidth[selector]) {
78359                   _needWidth[selector] = scrollWidth;
78360               }
78361
78362           } else if (scrollWidth >= needed) {
78363               element.classed('narrow', false);
78364           }
78365       };
78366
78367
78368       return ui;
78369   }
78370
78371   function uiChangesetEditor(context) {
78372       var dispatch$1 = dispatch('change');
78373       var formFields = uiFormFields(context);
78374       var commentCombo = uiCombobox(context, 'comment').caseSensitive(true);
78375       var _fieldsArr;
78376       var _tags;
78377       var _changesetID;
78378
78379
78380       function changesetEditor(selection) {
78381           render(selection);
78382       }
78383
78384
78385       function render(selection) {
78386           var initial = false;
78387
78388           if (!_fieldsArr) {
78389               initial = true;
78390               var presets = context.presets();
78391
78392               _fieldsArr = [
78393                   uiField(context, presets.field('comment'), null, { show: true, revert: false }),
78394                   uiField(context, presets.field('source'), null, { show: false, revert: false }),
78395                   uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
78396               ];
78397
78398               _fieldsArr.forEach(function(field) {
78399                   field
78400                       .on('change', function(t, onInput) {
78401                           dispatch$1.call('change', field, t, onInput);
78402                       });
78403               });
78404           }
78405
78406           _fieldsArr.forEach(function(field) {
78407               field
78408                   .tags(_tags);
78409           });
78410
78411
78412           selection
78413               .call(formFields.fieldsArr(_fieldsArr));
78414
78415
78416           if (initial) {
78417               var commentField = selection.select('#preset-input-comment');
78418               var commentNode = commentField.node();
78419
78420               if (commentNode) {
78421                   commentNode.focus();
78422                   commentNode.select();
78423               }
78424
78425               // trigger a 'blur' event so that comment field can be cleaned
78426               // and checked for hashtags, even if retrieved from localstorage
78427               utilTriggerEvent(commentField, 'blur');
78428
78429               var osm = context.connection();
78430               if (osm) {
78431                   osm.userChangesets(function (err, changesets) {
78432                       if (err) return;
78433
78434                       var comments = changesets.map(function(changeset) {
78435                           return {
78436                               title: changeset.tags.comment,
78437                               value: changeset.tags.comment
78438                           };
78439                       });
78440
78441                       commentField
78442                           .call(commentCombo
78443                               .data(uniqBy(comments, 'title'))
78444                           );
78445                   });
78446               }
78447           }
78448
78449           // Add warning if comment mentions Google
78450           var hasGoogle = _tags.comment.match(/google/i);
78451           var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning')
78452               .data(hasGoogle ? [0] : []);
78453
78454           commentWarning.exit()
78455               .transition()
78456               .duration(200)
78457               .style('opacity', 0)
78458               .remove();
78459
78460           var commentEnter = commentWarning.enter()
78461               .insert('div', '.tag-reference-body')
78462               .attr('class', 'field-warning comment-warning')
78463               .style('opacity', 0);
78464
78465           commentEnter
78466               .append('a')
78467               .attr('target', '_blank')
78468               .attr('tabindex', -1)
78469               .call(svgIcon('#iD-icon-alert', 'inline'))
78470               .attr('href', t('commit.google_warning_link'))
78471               .append('span')
78472               .text(t('commit.google_warning'));
78473
78474           commentEnter
78475               .transition()
78476               .duration(200)
78477               .style('opacity', 1);
78478       }
78479
78480
78481       changesetEditor.tags = function(_) {
78482           if (!arguments.length) return _tags;
78483           _tags = _;
78484           // Don't reset _fieldsArr here.
78485           return changesetEditor;
78486       };
78487
78488
78489       changesetEditor.changesetID = function(_) {
78490           if (!arguments.length) return _changesetID;
78491           if (_changesetID === _) return changesetEditor;
78492           _changesetID = _;
78493           _fieldsArr = null;
78494           return changesetEditor;
78495       };
78496
78497
78498       return utilRebind(changesetEditor, dispatch$1, 'on');
78499   }
78500
78501   // This code assumes that the combobox values will not have duplicate entries.
78502   // It is keyed on the `value` of the entry. Data should be an array of objects like:
78503   //   [{
78504   //       value:  'display text',  // required
78505   //       title:  'hover text'     // optional
78506   //   }, ...]
78507
78508   var _comboHideTimerID;
78509
78510   function uiCombobox(context, klass) {
78511       var dispatch$1 = dispatch('accept', 'cancel');
78512       var container = context.container();
78513
78514       var _suggestions = [];
78515       var _data = [];
78516       var _fetched = {};
78517       var _selected = null;
78518       var _canAutocomplete = true;
78519       var _caseSensitive = false;
78520       var _cancelFetch = false;
78521       var _minItems = 2;
78522       var _tDown = 0;
78523
78524       var _fetcher = function(val, cb) {
78525           cb(_data.filter(function(d) {
78526               return d.value
78527                   .toString()
78528                   .toLowerCase()
78529                   .indexOf(val.toLowerCase()) !== -1;
78530           }));
78531       };
78532
78533       var combobox = function(input, attachTo) {
78534           if (!input || input.empty()) return;
78535
78536           input
78537               .classed('combobox-input', true)
78538               .on('focus.combo-input', focus)
78539               .on('blur.combo-input', blur)
78540               .on('keydown.combo-input', keydown)
78541               .on('keyup.combo-input', keyup)
78542               .on('input.combo-input', change)
78543               .on('mousedown.combo-input', mousedown)
78544               .each(function() {
78545                   var parent = this.parentNode;
78546                   var sibling = this.nextSibling;
78547
78548                   select(parent).selectAll('.combobox-caret')
78549                       .filter(function(d) { return d === input.node(); })
78550                       .data([input.node()])
78551                       .enter()
78552                       .insert('div', function() { return sibling; })
78553                       .attr('class', 'combobox-caret')
78554                       .on('mousedown.combo-caret', function() {
78555                           event.preventDefault(); // don't steal focus from input
78556                           input.node().focus(); // focus the input as if it was clicked
78557                           mousedown();
78558                       })
78559                       .on('mouseup.combo-caret', function() {
78560                           event.preventDefault(); // don't steal focus from input
78561                           mouseup();
78562                       });
78563               });
78564
78565
78566           function mousedown() {
78567               if (event.button !== 0) return;    // left click only
78568               _tDown = +new Date();
78569
78570               // clear selection
78571               var start = input.property('selectionStart');
78572               var end = input.property('selectionEnd');
78573               if (start !== end) {
78574                   var val = utilGetSetValue(input);
78575                   input.node().setSelectionRange(val.length, val.length);
78576                   return;
78577               }
78578
78579               input.on('mouseup.combo-input', mouseup);
78580           }
78581
78582
78583           function mouseup() {
78584               input.on('mouseup.combo-input', null);
78585               if (event.button !== 0) return;    // left click only
78586               if (input.node() !== document.activeElement) return;   // exit if this input is not focused
78587
78588               var start = input.property('selectionStart');
78589               var end = input.property('selectionEnd');
78590               if (start !== end) return;  // exit if user is selecting
78591
78592               // not showing or showing for a different field - try to show it.
78593               var combo = container.selectAll('.combobox');
78594               if (combo.empty() || combo.datum() !== input.node()) {
78595                   var tOrig = _tDown;
78596                   window.setTimeout(function() {
78597                       if (tOrig !== _tDown) return;   // exit if user double clicked
78598                       fetch('', function() {
78599                           show();
78600                           render();
78601                       });
78602                   }, 250);
78603
78604               } else {
78605                   hide();
78606               }
78607           }
78608
78609
78610           function focus() {
78611               fetch('');   // prefetch values (may warm taginfo cache)
78612           }
78613
78614
78615           function blur() {
78616               _comboHideTimerID = window.setTimeout(hide, 75);
78617           }
78618
78619
78620           function show() {
78621               hide();   // remove any existing
78622
78623               container
78624                   .insert('div', ':first-child')
78625                   .datum(input.node())
78626                   .attr('class', 'combobox' + (klass ? ' combobox-' + klass : ''))
78627                   .style('position', 'absolute')
78628                   .style('display', 'block')
78629                   .style('left', '0px')
78630                   .on('mousedown.combo-container', function () {
78631                       // prevent moving focus out of the input field
78632                       event.preventDefault();
78633                   });
78634
78635               select('body')
78636                   .on('scroll.combo-scroll', render, true);
78637           }
78638
78639
78640           function hide() {
78641               if (_comboHideTimerID) {
78642                   window.clearTimeout(_comboHideTimerID);
78643                   _comboHideTimerID = undefined;
78644               }
78645
78646               container.selectAll('.combobox')
78647                   .remove();
78648
78649               select('body')
78650                   .on('scroll.combo-scroll', null);
78651           }
78652
78653
78654           function keydown() {
78655               var shown = !container.selectAll('.combobox').empty();
78656               var tagName = input.node() ? input.node().tagName.toLowerCase() : '';
78657
78658               switch (event.keyCode) {
78659                   case 8:   // ⌫ Backspace
78660                   case 46:  // ⌦ Delete
78661                       event.stopPropagation();
78662                       _selected = null;
78663                       render();
78664                       input.on('input.combo-input', function() {
78665                           var start = input.property('selectionStart');
78666                           input.node().setSelectionRange(start, start);
78667                           input.on('input.combo-input', change);
78668                       });
78669                       break;
78670
78671                   case 9:   // ⇥ Tab
78672                       accept();
78673                       break;
78674
78675                   case 13:  // ↩ Return
78676                       event.preventDefault();
78677                       event.stopPropagation();
78678                       break;
78679
78680                   case 38:  // ↑ Up arrow
78681                       if (tagName === 'textarea' && !shown) return;
78682                       event.preventDefault();
78683                       if (tagName === 'input' && !shown) {
78684                           show();
78685                       }
78686                       nav(-1);
78687                       break;
78688
78689                   case 40:  // ↓ Down arrow
78690                       if (tagName === 'textarea' && !shown) return;
78691                       event.preventDefault();
78692                       if (tagName === 'input' && !shown) {
78693                           show();
78694                       }
78695                       nav(+1);
78696                       break;
78697               }
78698           }
78699
78700
78701           function keyup() {
78702               switch (event.keyCode) {
78703                   case 27:  // ⎋ Escape
78704                       cancel();
78705                       break;
78706
78707                   case 13:  // ↩ Return
78708                       accept();
78709                       break;
78710               }
78711           }
78712
78713
78714           // Called whenever the input value is changed (e.g. on typing)
78715           function change() {
78716               fetch(value(), function() {
78717                   _selected = null;
78718                   var val = input.property('value');
78719
78720                   if (_suggestions.length) {
78721                       if (input.property('selectionEnd') === val.length) {
78722                           _selected = tryAutocomplete();
78723                       }
78724
78725                       if (!_selected) {
78726                           _selected = val;
78727                       }
78728                   }
78729
78730                   if (val.length) {
78731                       var combo = container.selectAll('.combobox');
78732                       if (combo.empty()) {
78733                           show();
78734                       }
78735                   } else {
78736                       hide();
78737                   }
78738
78739                   render();
78740               });
78741           }
78742
78743
78744           // Called when the user presses up/down arrows to navigate the list
78745           function nav(dir) {
78746               if (_suggestions.length) {
78747                   // try to determine previously selected index..
78748                   var index = -1;
78749                   for (var i = 0; i < _suggestions.length; i++) {
78750                       if (_selected && _suggestions[i].value === _selected) {
78751                           index = i;
78752                           break;
78753                       }
78754                   }
78755
78756                   // pick new _selected
78757                   index = Math.max(Math.min(index + dir, _suggestions.length - 1), 0);
78758                   _selected = _suggestions[index].value;
78759                   input.property('value', _selected);
78760               }
78761
78762               render();
78763               ensureVisible();
78764           }
78765
78766
78767           function ensureVisible() {
78768               var combo = container.selectAll('.combobox');
78769               if (combo.empty()) return;
78770
78771               var containerRect = container.node().getBoundingClientRect();
78772               var comboRect = combo.node().getBoundingClientRect();
78773
78774               if (comboRect.bottom > containerRect.bottom) {
78775                   var node = attachTo ? attachTo.node() : input.node();
78776                   node.scrollIntoView({ behavior: 'instant', block: 'center' });
78777                   render();
78778               }
78779
78780               // https://stackoverflow.com/questions/11039885/scrollintoview-causing-the-whole-page-to-move
78781               var selected = combo.selectAll('.combobox-option.selected').node();
78782               if (selected) {
78783                   selected.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
78784               }
78785           }
78786
78787
78788           function value() {
78789               var value = input.property('value');
78790               var start = input.property('selectionStart');
78791               var end = input.property('selectionEnd');
78792
78793               if (start && end) {
78794                   value = value.substring(0, start);
78795               }
78796
78797               return value;
78798           }
78799
78800
78801           function fetch(v, cb) {
78802               _cancelFetch = false;
78803
78804               _fetcher.call(input, v, function(results) {
78805                   // already chose a value, don't overwrite or autocomplete it
78806                   if (_cancelFetch) return;
78807
78808                   _suggestions = results;
78809                   results.forEach(function(d) { _fetched[d.value] = d; });
78810
78811                   if (cb) {
78812                       cb();
78813                   }
78814               });
78815           }
78816
78817
78818           function tryAutocomplete() {
78819               if (!_canAutocomplete) return;
78820
78821               var val = _caseSensitive ? value() : value().toLowerCase();
78822               if (!val) return;
78823
78824               // Don't autocomplete if user is typing a number - #4935
78825               if (!isNaN(parseFloat(val)) && isFinite(val)) return;
78826
78827               var bestIndex = -1;
78828               for (var i = 0; i < _suggestions.length; i++) {
78829                   var suggestion = _suggestions[i].value;
78830                   var compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
78831
78832                   // if search string matches suggestion exactly, pick it..
78833                   if (compare === val) {
78834                       bestIndex = i;
78835                       break;
78836
78837                   // otherwise lock in the first result that starts with the search string..
78838                   } else if (bestIndex === -1 && compare.indexOf(val) === 0) {
78839                       bestIndex = i;
78840                   }
78841               }
78842
78843               if (bestIndex !== -1) {
78844                   var bestVal = _suggestions[bestIndex].value;
78845                   input.property('value', bestVal);
78846                   input.node().setSelectionRange(val.length, bestVal.length);
78847                   return bestVal;
78848               }
78849           }
78850
78851
78852           function render() {
78853               if (_suggestions.length < _minItems || document.activeElement !== input.node()) {
78854                   hide();
78855                   return;
78856               }
78857
78858               var shown = !container.selectAll('.combobox').empty();
78859               if (!shown) return;
78860
78861               var combo = container.selectAll('.combobox');
78862               var options = combo.selectAll('.combobox-option')
78863                   .data(_suggestions, function(d) { return d.value; });
78864
78865               options.exit()
78866                   .remove();
78867
78868               // enter/update
78869               options.enter()
78870                   .append('a')
78871                   .attr('class', 'combobox-option')
78872                   .attr('title', function(d) { return d.title; })
78873                   .text(function(d) { return d.display || d.value; })
78874                   .merge(options)
78875                   .classed('selected', function(d) { return d.value === _selected; })
78876                   .on('click.combo-option', accept)
78877                   .order();
78878
78879               var node = attachTo ? attachTo.node() : input.node();
78880               var rect = node.getBoundingClientRect();
78881
78882               combo
78883                   .style('left', (rect.left + 5) + 'px')
78884                   .style('width', (rect.width - 10) + 'px')
78885                   .style('top', rect.height + rect.top + 'px');
78886           }
78887
78888
78889           // Dispatches an 'accept' event
78890           // Then hides the combobox.
78891           function accept(d) {
78892               _cancelFetch = true;
78893               var thiz = input.node();
78894
78895               if (d) {   // user clicked on a suggestion
78896                   utilGetSetValue(input, d.value);    // replace field contents
78897                   utilTriggerEvent(input, 'change');
78898               }
78899
78900               // clear (and keep) selection
78901               var val = utilGetSetValue(input);
78902               thiz.setSelectionRange(val.length, val.length);
78903
78904               d = _fetched[val];
78905               dispatch$1.call('accept', thiz, d, val);
78906               hide();
78907           }
78908
78909
78910           // Dispatches an 'cancel' event
78911           // Then hides the combobox.
78912           function cancel() {
78913               _cancelFetch = true;
78914               var thiz = input.node();
78915
78916               // clear (and remove) selection, and replace field contents
78917               var val = utilGetSetValue(input);
78918               var start = input.property('selectionStart');
78919               var end = input.property('selectionEnd');
78920               val = val.slice(0, start) + val.slice(end);
78921               utilGetSetValue(input, val);
78922               thiz.setSelectionRange(val.length, val.length);
78923
78924               dispatch$1.call('cancel', thiz);
78925               hide();
78926           }
78927
78928       };
78929
78930
78931       combobox.canAutocomplete = function(val) {
78932           if (!arguments.length) return _canAutocomplete;
78933           _canAutocomplete = val;
78934           return combobox;
78935       };
78936
78937       combobox.caseSensitive = function(val) {
78938           if (!arguments.length) return _caseSensitive;
78939           _caseSensitive = val;
78940           return combobox;
78941       };
78942
78943       combobox.data = function(val) {
78944           if (!arguments.length) return _data;
78945           _data = val;
78946           return combobox;
78947       };
78948
78949       combobox.fetcher = function(val) {
78950           if (!arguments.length) return _fetcher;
78951           _fetcher = val;
78952           return combobox;
78953       };
78954
78955       combobox.minItems = function(val) {
78956           if (!arguments.length) return _minItems;
78957           _minItems = val;
78958           return combobox;
78959       };
78960
78961
78962       return utilRebind(combobox, dispatch$1, 'on');
78963   }
78964
78965
78966   uiCombobox.off = function(input) {
78967       input
78968           .on('focus.combo-input', null)
78969           .on('blur.combo-input', null)
78970           .on('keydown.combo-input', null)
78971           .on('keyup.combo-input', null)
78972           .on('input.combo-input', null)
78973           .on('mousedown.combo-input', null)
78974           .on('mouseup.combo-input', null);
78975
78976
78977       select('body')
78978           .on('scroll.combo-scroll', null);
78979   };
78980
78981   /**
78982    * This method is like `_.union` except that it accepts `iteratee` which is
78983    * invoked for each element of each `arrays` to generate the criterion by
78984    * which uniqueness is computed. Result values are chosen from the first
78985    * array in which the value occurs. The iteratee is invoked with one argument:
78986    * (value).
78987    *
78988    * @static
78989    * @memberOf _
78990    * @since 4.0.0
78991    * @category Array
78992    * @param {...Array} [arrays] The arrays to inspect.
78993    * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
78994    * @returns {Array} Returns the new array of combined values.
78995    * @example
78996    *
78997    * _.unionBy([2.1], [1.2, 2.3], Math.floor);
78998    * // => [2.1, 1.2]
78999    *
79000    * // The `_.property` iteratee shorthand.
79001    * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
79002    * // => [{ 'x': 1 }, { 'x': 2 }]
79003    */
79004   var unionBy = baseRest(function(arrays) {
79005     var iteratee = last(arrays);
79006     if (isArrayLikeObject(iteratee)) {
79007       iteratee = undefined;
79008     }
79009     return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2));
79010   });
79011
79012   function uiCommitChanges(context) {
79013       var detected = utilDetect();
79014       var _entityID;
79015
79016
79017       function commitChanges(selection) {
79018           var history = context.history();
79019           var summary = history.difference().summary();
79020
79021           var container = selection.selectAll('.modal-section.commit-section')
79022               .data([0]);
79023
79024           var containerEnter = container.enter()
79025               .append('div')
79026               .attr('class', 'commit-section modal-section fillL2');
79027
79028           containerEnter
79029               .append('h3')
79030               .text(t('commit.changes', { count: summary.length }));
79031
79032           containerEnter
79033               .append('ul')
79034               .attr('class', 'changeset-list');
79035
79036           container = containerEnter
79037               .merge(container);
79038
79039
79040           var items = container.select('ul').selectAll('li')
79041               .data(summary);
79042
79043           var itemsEnter = items.enter()
79044               .append('li')
79045               .attr('class', 'change-item');
79046
79047           itemsEnter
79048               .each(function(d) {
79049                   select(this)
79050                       .call(svgIcon('#iD-icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
79051               });
79052
79053           itemsEnter
79054               .append('span')
79055               .attr('class', 'change-type')
79056               .text(function(d) { return t('commit.' + d.changeType) + ' '; });
79057
79058           itemsEnter
79059               .append('strong')
79060               .attr('class', 'entity-type')
79061               .text(function(d) {
79062                   var matched = context.presets().match(d.entity, d.graph);
79063                   return (matched && matched.name()) || utilDisplayType(d.entity.id);
79064               });
79065
79066           itemsEnter
79067               .append('span')
79068               .attr('class', 'entity-name')
79069               .text(function(d) {
79070                   var name = utilDisplayName(d.entity) || '',
79071                       string = '';
79072                   if (name !== '') {
79073                       string += ':';
79074                   }
79075                   return string += ' ' + name;
79076               });
79077
79078           itemsEnter
79079               .style('opacity', 0)
79080               .transition()
79081               .style('opacity', 1);
79082
79083           items = itemsEnter
79084               .merge(items);
79085
79086           items
79087               .on('mouseover', mouseover)
79088               .on('mouseout', mouseout)
79089               .on('click', click);
79090
79091
79092           // Download changeset link
79093           var changeset = new osmChangeset().update({ id: undefined });
79094           var changes = history.changes(actionDiscardTags(history.difference()));
79095
79096           delete changeset.id;  // Export without chnageset_id
79097
79098           var data = JXON.stringify(changeset.osmChangeJXON(changes));
79099           var blob = new Blob([data], {type: 'text/xml;charset=utf-8;'});
79100           var fileName = 'changes.osc';
79101
79102           var linkEnter = container.selectAll('.download-changes')
79103               .data([0])
79104               .enter()
79105               .append('a')
79106               .attr('class', 'download-changes');
79107
79108           if (detected.download) {      // All except IE11 and Edge
79109               linkEnter                 // download the data as a file
79110                   .attr('href', window.URL.createObjectURL(blob))
79111                   .attr('download', fileName);
79112
79113           } else {                      // IE11 and Edge
79114               linkEnter                 // open data uri in a new tab
79115                   .attr('target', '_blank')
79116                   .on('click.download', function() {
79117                       navigator.msSaveBlob(blob, fileName);
79118                   });
79119           }
79120
79121           linkEnter
79122               .call(svgIcon('#iD-icon-load', 'inline'))
79123               .append('span')
79124               .text(t('commit.download_changes'));
79125
79126
79127           function mouseover(d) {
79128               if (d.entity) {
79129                   context.surface().selectAll(
79130                       utilEntityOrMemberSelector([d.entity.id], context.graph())
79131                   ).classed('hover', true);
79132               }
79133           }
79134
79135
79136           function mouseout() {
79137               context.surface().selectAll('.hover')
79138                   .classed('hover', false);
79139           }
79140
79141
79142           function click(change) {
79143               if (change.changeType === 'deleted') {
79144                   _entityID = null;
79145               } else {
79146                   var entity = change.entity;
79147                   _entityID = change.entity.id;
79148                   context.map().zoomToEase(entity);
79149                   context.surface().selectAll(utilEntityOrMemberSelector([_entityID], context.graph()))
79150                       .classed('hover', true);
79151               }
79152           }
79153       }
79154
79155
79156       commitChanges.entityID = function(_) {
79157           if (!arguments.length) return _entityID;
79158           _entityID = _;
79159           return commitChanges;
79160       };
79161
79162
79163       return commitChanges;
79164   }
79165
79166   function uiCommitWarnings(context) {
79167
79168       function commitWarnings(selection) {
79169
79170           var issues = context.validator().getIssues();
79171
79172           issues = reduce(issues, function(issues, val) {
79173               var severity = val.severity;
79174               if (issues.hasOwnProperty(severity)) {
79175                   issues[severity].push(val);
79176               } else {
79177                   issues[severity] = [val];
79178               }
79179               return issues;
79180           }, {});
79181
79182           forEach(issues, function(instances, severity) {
79183               instances = uniqBy(instances, function(val) {
79184                   return val.entity || (val.id + '_' + val.message.replace(/\s+/g,''));
79185               });
79186               var section = severity + '-section';
79187               var instanceItem = severity + '-item';
79188
79189               var container = selection.selectAll('.' + section)
79190                   .data(instances.length ? [0] : []);
79191
79192               container.exit()
79193                   .remove();
79194
79195               var containerEnter = container.enter()
79196                   .append('div')
79197                   .attr('class', 'modal-section ' + section + ' fillL2');
79198
79199               containerEnter
79200                   .append('h3')
79201                   .text(severity === 'warning' ? t('commit.warnings') : t('commit.errors'));
79202
79203               containerEnter
79204                   .append('ul')
79205                   .attr('class', 'changeset-list');
79206
79207               container = containerEnter
79208                   .merge(container);
79209
79210
79211               var items = container.select('ul').selectAll('li')
79212                   .data(instances);
79213
79214               items.exit()
79215                   .remove();
79216
79217               var itemsEnter = items.enter()
79218                   .append('li')
79219                   .attr('class', instanceItem);
79220
79221               itemsEnter
79222                   .call(svgIcon('#iD-icon-alert', 'pre-text'));
79223
79224               itemsEnter
79225                   .append('strong')
79226                   .text(function(d) { return d.message; });
79227
79228               itemsEnter.filter(function(d) { return d.tooltip; })
79229                   .call(tooltip()
79230                       .title(function(d) { return d.tooltip; })
79231                       .placement('top')
79232                   );
79233
79234               items = itemsEnter
79235                   .merge(items);
79236
79237
79238               items
79239                   .on('mouseover', mouseover)
79240                   .on('mouseout', mouseout)
79241                   .on('click', warningClick);
79242
79243               function mouseover(d) {
79244                   if (d.entities) {
79245                       context.surface().selectAll(
79246                           utilEntityOrMemberSelector(
79247                               map$3(d.entities, function(e) { return e.id; }),
79248                               context.graph()
79249                           )
79250                       ).classed('hover', true);
79251                   }
79252               }
79253
79254               function mouseout() {
79255                   context.surface().selectAll('.hover')
79256                       .classed('hover', false);
79257               }
79258
79259               function warningClick(d) {
79260                   if (d.entities && d.entities.length > 0) {
79261                       context.map().zoomTo(d.entities[0]);
79262                       context.enter(modeSelect(
79263                           context,
79264                           map$3(d.entities, function(e) { return e.id; })
79265                       ));
79266                   }
79267               }
79268           });
79269       }
79270
79271
79272       return commitWarnings;
79273   }
79274
79275   function uiRawTagEditor(context) {
79276       var taginfo = services.taginfo;
79277       var dispatch$1 = dispatch('change');
79278       var _readOnlyTags = [];
79279       var _orderedKeys = [];
79280       var _showBlank = false;
79281       var _updatePreference = true;
79282       var _expanded = false;
79283       var _pendingChange = null;
79284       var _state;
79285       var _preset;
79286       var _tags;
79287       var _entityID;
79288
79289
79290       function rawTagEditor(selection) {
79291           var count = Object.keys(_tags).filter(function(d) { return d; }).length;
79292
79293           var disclosure = uiDisclosure(context, 'raw_tag_editor', false)
79294               .title(t('inspector.all_tags') + ' (' + count + ')')
79295               .on('toggled', toggled)
79296               .updatePreference(_updatePreference)
79297               .content(content);
79298
79299           // Sometimes we want to force the raw_tag_editor to be opened/closed..
79300           // When undefined, uiDisclosure will use the user's stored preference.
79301           if (_expanded !== undefined) {
79302               disclosure.expanded(_expanded);
79303           }
79304
79305           selection.call(disclosure);
79306
79307           function toggled(expanded) {
79308               _expanded = expanded;
79309               if (expanded) {
79310                   selection.node().parentNode.scrollTop += 200;
79311               }
79312           }
79313       }
79314
79315
79316       function content(wrap) {
79317           var rowData = [];
79318           var seen = {};
79319           var allKeys = Object.keys(_tags);
79320           var i, k;
79321
79322           // When switching to a different entity or changing the state (hover/select)
79323           // we reorder the keys.  Otherwise leave them as the user entered - #5857
79324           if (!_orderedKeys.length) {
79325               _orderedKeys = allKeys.sort();
79326           }
79327
79328           // push ordered keys first
79329           for (i = 0; i < _orderedKeys.length; i++) {
79330               k = _orderedKeys[i];
79331               if (_tags[k] === undefined) continue;   // e.g. tag was removed
79332               seen[k] = true;
79333               rowData.push({ key: k, value: _tags[k] });
79334           }
79335           // push unknown keys after - these are tags the user added
79336           for (i = 0; i < allKeys.length; i++) {
79337               k = allKeys[i];
79338               if (seen[k]) continue;
79339               rowData.push({ key: k, value: _tags[k] });
79340           }
79341           // push blank row last, if necessary
79342           if (!rowData.length || _showBlank) {
79343               _showBlank = false;
79344               rowData.push({ key: '', value: '' });
79345           }
79346
79347           // List of tags
79348           var list = wrap.selectAll('.tag-list')
79349               .data([0]);
79350
79351           list = list.enter()
79352               .append('ul')
79353               .attr('class', 'tag-list')
79354               .merge(list);
79355
79356
79357           // Container for the Add button
79358           var addRowEnter = wrap.selectAll('.add-row')
79359               .data([0])
79360               .enter()
79361               .append('div')
79362               .attr('class', 'add-row');
79363
79364           addRowEnter
79365               .append('button')
79366               .attr('class', 'add-tag')
79367               .call(svgIcon('#iD-icon-plus', 'light'))
79368               .on('click', addTag);
79369
79370           addRowEnter
79371               .append('div')
79372               .attr('class', 'space-value');   // preserve space
79373
79374           addRowEnter
79375               .append('div')
79376               .attr('class', 'space-buttons');  // preserve space
79377
79378
79379           // Tag list items
79380           var items = list.selectAll('.tag-row')
79381               .data(rowData, function(d) { return d.key; });
79382
79383           items.exit()
79384               .each(unbind)
79385               .remove();
79386
79387
79388           // Enter
79389           var itemsEnter = items.enter()
79390               .append('li')
79391               .attr('class', 'tag-row')
79392               .classed('readonly', isReadOnly);
79393
79394           var innerWrap = itemsEnter.append('div')
79395               .attr('class', 'inner-wrap');
79396
79397           innerWrap
79398               .append('div')
79399               .attr('class', 'key-wrap')
79400               .append('input')
79401               .property('type', 'text')
79402               .attr('class', 'key')
79403               .attr('maxlength', 255)
79404               .call(utilNoAuto)
79405               .on('blur', keyChange)
79406               .on('change', keyChange);
79407
79408           innerWrap
79409               .append('div')
79410               .attr('class', 'value-wrap')
79411               .append('input')
79412               .property('type', 'text')
79413               .attr('class', 'value')
79414               .attr('maxlength', 255)
79415               .call(utilNoAuto)
79416               .on('blur', valueChange)
79417               .on('change', valueChange)
79418               .on('keydown.push-more', pushMore);
79419
79420           innerWrap
79421               .append('button')
79422               .attr('tabindex', -1)
79423               .attr('class', 'form-field-button remove')
79424               .attr('title', t('icons.remove'))
79425               .call(svgIcon('#iD-operation-delete'));
79426
79427
79428           // Update
79429           items = items
79430               .merge(itemsEnter)
79431               .order();
79432
79433           items
79434               .each(function(d) {
79435                   var row = select(this);
79436                   var key = row.select('input.key');      // propagate bound data
79437                   var value = row.select('input.value');  // propagate bound data
79438
79439                   if (_entityID && taginfo && _state !== 'hover') {
79440                       bindTypeahead(key, value);
79441                   }
79442
79443                   var isRelation = (_entityID && context.entity(_entityID).type === 'relation');
79444                   var reference;
79445
79446                   if (isRelation && d.key === 'type') {
79447                       reference = uiTagReference({ rtype: d.value }, context);
79448                   } else {
79449                       reference = uiTagReference({ key: d.key, value: d.value }, context);
79450                   }
79451
79452                   if (_state === 'hover') {
79453                       reference.showing(false);
79454                   }
79455
79456                   row.select('.inner-wrap')      // propagate bound data
79457                       .call(reference.button);
79458
79459                   row.call(reference.body);
79460
79461                   row.select('button.remove');   // propagate bound data
79462               });
79463
79464           items.selectAll('input.key')
79465               .attr('title', function(d) { return d.key; })
79466               .call(utilGetSetValue, function(d) { return d.key; })
79467               .property('disabled', isReadOnly);
79468
79469           items.selectAll('input.value')
79470               .attr('title', function(d) { return d.value; })
79471               .call(utilGetSetValue, function(d) { return d.value; })
79472               .property('disabled', isReadOnly);
79473
79474           items.selectAll('button.remove')
79475               .on('mousedown', removeTag);  // 'click' fires too late - #5878
79476
79477
79478
79479           function isReadOnly(d) {
79480               for (var i = 0; i < _readOnlyTags.length; i++) {
79481                   if (d.key.match(_readOnlyTags[i]) !== null) {
79482                       return true;
79483                   }
79484               }
79485               return false;
79486           }
79487
79488
79489           function pushMore() {
79490               if (event.keyCode === 9 && !event.shiftKey &&
79491                   list.selectAll('li:last-child input.value').node() === this) {
79492                   addTag();
79493               }
79494           }
79495
79496
79497           function bindTypeahead(key, value) {
79498               if (isReadOnly(key.datum())) return;
79499
79500               var geometry = context.geometry(_entityID);
79501
79502               key.call(uiCombobox(context, 'tag-key')
79503                   .fetcher(function(value, callback) {
79504                       taginfo.keys({
79505                           debounce: true,
79506                           geometry: geometry,
79507                           query: value
79508                       }, function(err, data) {
79509                           if (!err) {
79510                               var filtered = data.filter(function(d) {
79511                                   return _tags[d.value] === undefined;
79512                               });
79513                               callback(sort(value, filtered));
79514                           }
79515                       });
79516                   }));
79517
79518               value.call(uiCombobox(context, 'tag-value')
79519                   .fetcher(function(value, callback) {
79520                       taginfo.values({
79521                           debounce: true,
79522                           key: utilGetSetValue(key),
79523                           geometry: geometry,
79524                           query: value
79525                       }, function(err, data) {
79526                           if (!err) callback(sort(value, data));
79527                       });
79528                   }));
79529
79530
79531               function sort(value, data) {
79532                   var sameletter = [];
79533                   var other = [];
79534                   for (var i = 0; i < data.length; i++) {
79535                       if (data[i].value.substring(0, value.length) === value) {
79536                           sameletter.push(data[i]);
79537                       } else {
79538                           other.push(data[i]);
79539                       }
79540                   }
79541                   return sameletter.concat(other);
79542               }
79543           }
79544
79545
79546           function unbind() {
79547               var row = select(this);
79548
79549               row.selectAll('input.key')
79550                   .call(uiCombobox.off);
79551
79552               row.selectAll('input.value')
79553                   .call(uiCombobox.off);
79554           }
79555
79556
79557           function keyChange(d) {
79558               var kOld = d.key;
79559               var kNew = this.value.trim();
79560               var row = this.parentNode.parentNode;
79561               var inputVal = select(row).selectAll('input.value');
79562               var vNew = utilGetSetValue(inputVal);
79563
79564               // if the key looks like "key=value", split them up - #5024
79565               if (kNew.indexOf('=') !== -1) {
79566                   var parts = kNew
79567                       .split('=')
79568                       .map(function(str) { return str.trim(); })
79569                       .filter(Boolean);
79570
79571                   if (parts.length === 2) {
79572                       kNew = parts[0];
79573                       vNew = parts[1];
79574                   }
79575               }
79576
79577               // allow no change if the key should be readonly
79578               if (isReadOnly({ key: kNew })) {
79579                   this.value = kOld;
79580                   return;
79581               }
79582
79583               // switch focus if key is already in use
79584               if (kNew && kNew !== kOld) {
79585                   if (_tags[kNew] !== undefined) {      // new key is already in use
79586                       this.value = kOld;                // reset the key
79587                       list.selectAll('input.value')
79588                           .each(function(d) {
79589                               if (d.key === kNew) {     // send focus to that other value combo instead
79590                                   var input = select(this).node();
79591                                   input.focus();
79592                                   input.select();
79593                               }
79594                           });
79595                       return;
79596                   }
79597               }
79598
79599               _pendingChange  = _pendingChange || {};
79600               if (kOld) {
79601                   _pendingChange[kOld] = undefined;
79602               }
79603               _pendingChange[kNew] = vNew;
79604
79605               d.key = kNew;    // update datum to avoid exit/enter on tag update
79606               d.value = vNew;
79607
79608               this.value = kNew;
79609               utilGetSetValue(inputVal, vNew);
79610
79611               scheduleChange();
79612           }
79613
79614
79615           function valueChange(d) {
79616               if (isReadOnly(d)) return;
79617
79618               _pendingChange  = _pendingChange || {};
79619               _pendingChange[d.key] = this.value;
79620               scheduleChange();
79621           }
79622
79623
79624           function removeTag(d) {
79625               if (isReadOnly(d)) return;
79626
79627               if (d.key === '') {    // removing the blank row
79628                   _showBlank = false;
79629                   content(wrap);
79630               } else {
79631                   _pendingChange  = _pendingChange || {};
79632                   _pendingChange[d.key] = undefined;
79633                   scheduleChange();
79634               }
79635           }
79636
79637
79638           function addTag() {
79639               // Delay render in case this click is blurring an edited combo.
79640               // Without the setTimeout, the `content` render would wipe out the pending tag change.
79641               window.setTimeout(function() {
79642                   _showBlank = true;
79643                   content(wrap);
79644                   list.selectAll('li:last-child input.key').node().focus();
79645               }, 20);
79646           }
79647
79648
79649           function scheduleChange() {
79650               // Delay change in case this change is blurring an edited combo. - #5878
79651               window.setTimeout(function() {
79652                   dispatch$1.call('change', this, _pendingChange);
79653                   _pendingChange = null;
79654               }, 10);
79655           }
79656
79657       }
79658
79659
79660       rawTagEditor.state = function(val) {
79661           if (!arguments.length) return _state;
79662           if (_state !== val) {
79663               _orderedKeys = [];
79664               _state = val;
79665           }
79666           return rawTagEditor;
79667       };
79668
79669
79670       rawTagEditor.preset = function(val) {
79671           if (!arguments.length) return _preset;
79672           _preset = val;
79673           if (_preset.isFallback()) {
79674               _expanded = true;
79675               _updatePreference = false;
79676           } else {
79677               _expanded = undefined;
79678               _updatePreference = true;
79679           }
79680           return rawTagEditor;
79681       };
79682
79683
79684       rawTagEditor.tags = function(val) {
79685           if (!arguments.length) return _tags;
79686           _tags = val;
79687           return rawTagEditor;
79688       };
79689
79690
79691       rawTagEditor.entityID = function(val) {
79692           if (!arguments.length) return _entityID;
79693           if (_entityID !== val) {
79694               _orderedKeys = [];
79695               _entityID = val;
79696           }
79697           return rawTagEditor;
79698       };
79699
79700
79701       rawTagEditor.expanded = function(val) {
79702           if (!arguments.length) return _expanded;
79703           _expanded = val;
79704           _updatePreference = false;
79705           return rawTagEditor;
79706       };
79707
79708
79709       rawTagEditor.readOnlyTags = function(val) {
79710           if (!arguments.length) return _readOnlyTags;
79711           _readOnlyTags = val;
79712           return rawTagEditor;
79713       };
79714
79715
79716       return utilRebind(rawTagEditor, dispatch$1, 'on');
79717   }
79718
79719   var _changeset$1;
79720   var readOnlyTags = [
79721       /^changesets_count$/,
79722       /^created_by$/,
79723       /^ideditor:/,
79724       /^imagery_used$/,
79725       /^host$/,
79726       /^locale$/
79727   ];
79728
79729   // treat most punctuation (except -, _, +, &) as hashtag delimiters - #4398
79730   // from https://stackoverflow.com/a/25575009
79731   var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
79732
79733
79734   function uiCommit(context) {
79735       var dispatch$1 = dispatch('cancel', 'save');
79736       var _userDetails;
79737       var _selection;
79738
79739       var changesetEditor = uiChangesetEditor(context)
79740           .on('change', changeTags);
79741       var rawTagEditor = uiRawTagEditor(context)
79742           .on('change', changeTags);
79743       var commitChanges = uiCommitChanges(context);
79744       var commitWarnings = uiCommitWarnings(context);
79745
79746
79747       function commit(selection) {
79748           _selection = selection;
79749
79750           var osm = context.connection();
79751           if (!osm) return;
79752
79753           // expire stored comment, hashtags, source after cutoff datetime - #3947 #4899
79754           var commentDate = +context.storage('commentDate') || 0;
79755           var currDate = Date.now();
79756           var cutoff = 2 * 86400 * 1000;   // 2 days
79757           if (commentDate > currDate || currDate - commentDate > cutoff) {
79758               context.storage('comment', null);
79759               context.storage('hashtags', null);
79760               context.storage('source', null);
79761           }
79762
79763           var tags;
79764           // Initialize changeset if one does not exist yet.
79765           // Also pull values from local storage.
79766           if (!_changeset$1) {
79767               var detected = utilDetect();
79768               tags = {
79769                   comment: context.storage('comment') || '',
79770                   created_by: ('iD ' + context.version).substr(0, 255),
79771                   host: detected.host.substr(0, 255),
79772                   locale: detected.locale.substr(0, 255)
79773               };
79774
79775               // call findHashtags initially - this will remove stored
79776               // hashtags if any hashtags are found in the comment - #4304
79777               findHashtags(tags, true);
79778
79779               var hashtags = context.storage('hashtags');
79780               if (hashtags) {
79781                   tags.hashtags = hashtags;
79782               }
79783
79784               var source = context.storage('source');
79785               if (source) {
79786                   tags.source = source;
79787               }
79788
79789               _changeset$1 = new osmChangeset({ tags: tags });
79790           }
79791
79792           tags = clone(_changeset$1.tags);
79793
79794           // assign tags for imagery used
79795           var imageryUsed = context.history().imageryUsed().join(';').substr(0, 255);
79796           tags.imagery_used = imageryUsed || 'None';
79797
79798           // assign tags for closed issues and notes
79799           var osmClosed = osm.getClosedIDs();
79800           if (osmClosed.length) {
79801               tags['closed:note'] = osmClosed.join(';').substr(0, 255);
79802           }
79803           if (services.keepRight) {
79804               var krClosed = services.keepRight.getClosedIDs();
79805               if (krClosed.length) {
79806                   tags['closed:keepright'] = krClosed.join(';').substr(0, 255);
79807               }
79808           }
79809           if (services.improveOSM) {
79810               var iOsmClosed = services.improveOSM.getClosedIDs();
79811               if (iOsmClosed.length) {
79812                   tags['closed:improveosm'] = iOsmClosed.join(';').substr(0, 255);
79813               }
79814           }
79815
79816           _changeset$1 = _changeset$1.update({ tags: tags });
79817
79818           var header = selection.selectAll('.header')
79819               .data([0]);
79820
79821           var headerTitle = header.enter()
79822               .append('div')
79823               .attr('class', 'header fillL header-container');
79824
79825           headerTitle
79826               .append('div')
79827               .attr('class', 'header-block header-block-outer');
79828
79829           headerTitle
79830               .append('div')
79831               .attr('class', 'header-block')
79832               .append('h3')
79833               .text(t('commit.title'));
79834
79835           headerTitle
79836               .append('div')
79837               .attr('class', 'header-block header-block-outer header-block-close')
79838               .append('button')
79839               .attr('class', 'close')
79840               .on('click', function() { context.enter(modeBrowse(context)); })
79841               .call(svgIcon('#iD-icon-close'));
79842
79843           var body = selection.selectAll('.body')
79844               .data([0]);
79845
79846           body = body.enter()
79847               .append('div')
79848               .attr('class', 'body')
79849               .merge(body);
79850
79851
79852           // Changeset Section
79853           var changesetSection = body.selectAll('.changeset-editor')
79854               .data([0]);
79855
79856           changesetSection = changesetSection.enter()
79857               .append('div')
79858               .attr('class', 'modal-section changeset-editor')
79859               .merge(changesetSection);
79860
79861           changesetSection
79862               .call(changesetEditor
79863                   .changesetID(_changeset$1.id)
79864                   .tags(tags)
79865               );
79866
79867
79868           // Warnings
79869           body.call(commitWarnings);
79870
79871
79872           // Upload Explanation
79873           var saveSection = body.selectAll('.save-section')
79874               .data([0]);
79875
79876           saveSection = saveSection.enter()
79877               .append('div')
79878               .attr('class','modal-section save-section fillL cf')
79879               .merge(saveSection);
79880
79881           var prose = saveSection.selectAll('.commit-info')
79882               .data([0]);
79883
79884           prose = prose.enter()
79885               .append('p')
79886               .attr('class', 'commit-info')
79887               .text(t('commit.upload_explanation'))
79888               .merge(prose);
79889
79890           osm.userDetails(function(err, user) {
79891               if (err) return;
79892
79893               var userLink = select(document.createElement('div'));
79894
79895               _userDetails = user;
79896
79897               if (user.image_url) {
79898                   userLink
79899                       .append('img')
79900                       .attr('src', user.image_url)
79901                       .attr('class', 'icon pre-text user-icon');
79902               }
79903
79904               userLink
79905                   .append('a')
79906                   .attr('class', 'user-info')
79907                   .text(user.display_name)
79908                   .attr('href', osm.userURL(user.display_name))
79909                   .attr('tabindex', -1)
79910                   .attr('target', '_blank');
79911
79912               prose
79913                   .html(t('commit.upload_explanation_with_user', { user: userLink.html() }));
79914           });
79915
79916
79917           // Request Review
79918           var requestReview = saveSection.selectAll('.request-review')
79919               .data([0]);
79920
79921           // Enter
79922           var requestReviewEnter = requestReview.enter()
79923               .append('div')
79924               .attr('class', 'request-review');
79925
79926           var labelEnter = requestReviewEnter
79927               .append('label')
79928               .attr('for', 'commit-input-request-review');
79929
79930           labelEnter
79931               .append('input')
79932               .attr('type', 'checkbox')
79933               .attr('id', 'commit-input-request-review');
79934
79935           labelEnter
79936               .append('span')
79937               .text(t('commit.request_review'));
79938
79939           // Update
79940           requestReview = requestReview
79941               .merge(requestReviewEnter);
79942
79943           var requestReviewInput = requestReview.selectAll('input')
79944               .property('checked', isReviewRequested(_changeset$1.tags))
79945               .on('change', toggleRequestReview);
79946
79947
79948           // Buttons
79949           var buttonSection = saveSection.selectAll('.buttons')
79950               .data([0]);
79951
79952           // enter
79953           var buttonEnter = buttonSection.enter()
79954               .append('div')
79955               .attr('class', 'buttons fillL cf');
79956
79957           buttonEnter
79958               .append('button')
79959               .attr('class', 'secondary-action button cancel-button')
79960               .append('span')
79961               .attr('class', 'label')
79962               .text(t('commit.cancel'));
79963
79964           var uploadButton = buttonEnter
79965               .append('button')
79966               .attr('class', 'action button save-button');
79967
79968           uploadButton.append('span')
79969               .attr('class', 'label')
79970               .text(t('commit.save'));
79971
79972           var uploadBlockerTooltipText = getUploadBlockerMessage();
79973
79974           // update
79975           buttonSection = buttonSection
79976               .merge(buttonEnter);
79977
79978           buttonSection.selectAll('.cancel-button')
79979               .on('click.cancel', function() {
79980                   var selectedID = commitChanges.entityID();
79981                   dispatch$1.call('cancel', this, selectedID);
79982               });
79983
79984           buttonSection.selectAll('.save-button')
79985               .classed('disabled', uploadBlockerTooltipText !== null)
79986               .on('click.save', function() {
79987                   if (!select(this).classed('disabled')) {
79988                       this.blur();    // avoid keeping focus on the button - #4641
79989                       dispatch$1.call('save', this, _changeset$1);
79990                   }
79991               });
79992
79993           // remove any existing tooltip
79994           tooltip().destroyAny(buttonSection.selectAll('.save-button'));
79995
79996           if (uploadBlockerTooltipText) {
79997               buttonSection.selectAll('.save-button')
79998                   .call(tooltip().title(uploadBlockerTooltipText).placement('top'));
79999           }
80000
80001           // Raw Tag Editor
80002           var tagSection = body.selectAll('.tag-section.raw-tag-editor')
80003               .data([0]);
80004
80005           tagSection = tagSection.enter()
80006               .append('div')
80007               .attr('class', 'modal-section tag-section raw-tag-editor')
80008               .merge(tagSection);
80009
80010           var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
80011           tagSection
80012               .call(rawTagEditor
80013                   .expanded(expanded)
80014                   .readOnlyTags(readOnlyTags)
80015                   .tags(clone(_changeset$1.tags))
80016               );
80017
80018
80019           // Change summary
80020           body.call(commitChanges);
80021
80022
80023           function toggleRequestReview() {
80024               var rr = requestReviewInput.property('checked');
80025               updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
80026
80027               var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
80028               tagSection
80029                   .call(rawTagEditor
80030                       .expanded(expanded)
80031                       .readOnlyTags(readOnlyTags)
80032                       .tags(clone(_changeset$1.tags))
80033                   );
80034           }
80035       }
80036
80037
80038       function getUploadBlockerMessage() {
80039           var errorCount = context.validator().getErrors().length;
80040           if (errorCount > 0) {
80041               return t('commit.outstanding_errors_message', { count: errorCount });
80042
80043           } else {
80044               var n = select('#preset-input-comment').node();
80045               var hasChangesetComment = n && n.value.length > 0;
80046               if (!hasChangesetComment) {
80047                   return t('commit.comment_needed_message');
80048               }
80049           }
80050           return null;
80051       }
80052
80053
80054       function changeTags(changed, onInput) {
80055           if (changed.hasOwnProperty('comment')) {
80056               if (changed.comment === undefined) {
80057                   changed.comment = '';
80058               }
80059               if (!onInput) {
80060                   context.storage('comment', changed.comment);
80061                   context.storage('commentDate', Date.now());
80062               }
80063           }
80064           if (changed.hasOwnProperty('source')) {
80065               if (changed.source === undefined) {
80066                   context.storage('source', null);
80067               } else if (!onInput) {
80068                   context.storage('source', changed.source);
80069                   context.storage('commentDate', Date.now());
80070               }
80071           }
80072
80073           updateChangeset(changed, onInput);
80074
80075           if (_selection) {
80076               _selection.call(commit);
80077           }
80078       }
80079
80080
80081       function findHashtags(tags, commentOnly) {
80082           var inComment = commentTags();
80083           var inHashTags = hashTags();
80084
80085           if (inComment !== null) {                    // when hashtags are detected in comment...
80086               context.storage('hashtags', null);       // always remove stored hashtags - #4304
80087               if (commentOnly) { inHashTags = null; }  // optionally override hashtags field
80088           }
80089           return unionBy(inComment, inHashTags, function (s) {
80090               return s.toLowerCase();
80091           });
80092
80093           // Extract hashtags from `comment`
80094           function commentTags() {
80095               return tags.comment
80096                   .replace(/http\S*/g, '')  // drop anything that looks like a URL - #4289
80097                   .match(hashtagRegex);
80098           }
80099
80100           // Extract and clean hashtags from `hashtags`
80101           function hashTags() {
80102               var t = tags.hashtags || '';
80103               return t
80104                   .split(/[,;\s]+/)
80105                   .map(function (s) {
80106                       if (s[0] !== '#') { s = '#' + s; }    // prepend '#'
80107                       var matched = s.match(hashtagRegex);
80108                       return matched && matched[0];
80109                   }).filter(Boolean);                       // exclude falsey
80110           }
80111       }
80112
80113
80114       function isReviewRequested(tags) {
80115           var rr = tags.review_requested;
80116           if (rr === undefined) return false;
80117           rr = rr.trim().toLowerCase();
80118           return !(rr === '' || rr === 'no');
80119       }
80120
80121
80122       function updateChangeset(changed, onInput) {
80123           var tags = clone(_changeset$1.tags);
80124
80125           forEach(changed, function(v, k) {
80126               k = k.trim().substr(0, 255);
80127               if (readOnlyTags.indexOf(k) !== -1) return;
80128
80129               if (k !== '' && v !== undefined) {
80130                   if (onInput) {
80131                       tags[k] = v;
80132                   } else {
80133                       tags[k] = v.trim().substr(0, 255);
80134                   }
80135               } else {
80136                   delete tags[k];
80137               }
80138           });
80139
80140           if (!onInput) {
80141               // when changing the comment, override hashtags with any found in comment.
80142               var commentOnly = changed.hasOwnProperty('comment') && (changed.comment !== '');
80143               var arr = findHashtags(tags, commentOnly);
80144               if (arr.length) {
80145                   tags.hashtags = arr.join(';').substr(0, 255);
80146                   context.storage('hashtags', tags.hashtags);
80147               } else {
80148                   delete tags.hashtags;
80149                   context.storage('hashtags', null);
80150               }
80151           }
80152
80153           // always update userdetails, just in case user reauthenticates as someone else
80154           if (_userDetails && _userDetails.changesets_count !== undefined) {
80155               var changesetsCount = parseInt(_userDetails.changesets_count, 10) + 1;  // #4283
80156               tags.changesets_count = String(changesetsCount);
80157
80158               // first 100 edits - new user
80159               if (changesetsCount <= 100) {
80160                   var s;
80161                   s = context.storage('walkthrough_completed');
80162                   if (s) {
80163                       tags['ideditor:walkthrough_completed'] = s;
80164                   }
80165
80166                   s = context.storage('walkthrough_progress');
80167                   if (s) {
80168                       tags['ideditor:walkthrough_progress'] = s;
80169                   }
80170
80171                   s = context.storage('walkthrough_started');
80172                   if (s) {
80173                       tags['ideditor:walkthrough_started'] = s;
80174                   }
80175               }
80176           } else {
80177               delete tags.changesets_count;
80178           }
80179
80180           if (!isEqual(_changeset$1.tags, tags)) {
80181               _changeset$1 = _changeset$1.update({ tags: tags });
80182           }
80183       }
80184
80185
80186       commit.reset = function() {
80187           _changeset$1 = null;
80188       };
80189
80190
80191       return utilRebind(commit, dispatch$1, 'on');
80192   }
80193
80194   function uiConflicts(context) {
80195       var dispatch$1 = dispatch('cancel', 'save');
80196       var keybinding = utilKeybinding('conflicts');
80197       var _origChanges;
80198       var _conflictList;
80199
80200
80201       function keybindingOn() {
80202           select(document)
80203               .call(keybinding.on('⎋', cancel, true));
80204       }
80205
80206       function keybindingOff() {
80207           select(document)
80208               .call(keybinding.unbind);
80209       }
80210
80211       function tryAgain() {
80212           keybindingOff();
80213           dispatch$1.call('save');
80214       }
80215
80216       function cancel() {
80217           keybindingOff();
80218           dispatch$1.call('cancel');
80219       }
80220
80221
80222       function conflicts(selection) {
80223           keybindingOn();
80224
80225           var headerEnter = selection.selectAll('.header')
80226               .data([0])
80227               .enter()
80228               .append('div')
80229               .attr('class', 'header fillL');
80230
80231           headerEnter
80232               .append('button')
80233               .attr('class', 'fr')
80234               .on('click', cancel)
80235               .call(svgIcon('#iD-icon-close'));
80236
80237           headerEnter
80238               .append('h3')
80239               .text(t('save.conflict.header'));
80240
80241           var bodyEnter = selection.selectAll('.body')
80242               .data([0])
80243               .enter()
80244               .append('div')
80245               .attr('class', 'body fillL');
80246
80247           var conflictsHelpEnter = bodyEnter
80248               .append('div')
80249               .attr('class', 'conflicts-help')
80250               .text(t('save.conflict.help'));
80251
80252
80253           // Download changes link
80254           var detected = utilDetect();
80255           var changeset = new osmChangeset();
80256
80257           delete changeset.id;  // Export without changeset_id
80258
80259           var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
80260           var blob = new Blob([data], { type: 'text/xml;charset=utf-8;' });
80261           var fileName = 'changes.osc';
80262
80263           var linkEnter = conflictsHelpEnter.selectAll('.download-changes')
80264               .append('a')
80265               .attr('class', 'download-changes');
80266
80267           if (detected.download) {      // All except IE11 and Edge
80268               linkEnter                 // download the data as a file
80269                   .attr('href', window.URL.createObjectURL(blob))
80270                   .attr('download', fileName);
80271
80272           } else {                      // IE11 and Edge
80273               linkEnter                 // open data uri in a new tab
80274                   .attr('target', '_blank')
80275                   .on('click.download', function() {
80276                       navigator.msSaveBlob(blob, fileName);
80277                   });
80278           }
80279
80280           linkEnter
80281               .call(svgIcon('#iD-icon-load', 'inline'))
80282               .append('span')
80283               .text(t('save.conflict.download_changes'));
80284
80285
80286           bodyEnter
80287               .append('div')
80288               .attr('class', 'conflict-container fillL3')
80289               .call(showConflict, 0);
80290
80291           bodyEnter
80292               .append('div')
80293               .attr('class', 'conflicts-done')
80294               .attr('opacity', 0)
80295               .style('display', 'none')
80296               .text(t('save.conflict.done'));
80297
80298           var buttonsEnter = bodyEnter
80299               .append('div')
80300               .attr('class','buttons col12 joined conflicts-buttons');
80301
80302           buttonsEnter
80303               .append('button')
80304               .attr('disabled', _conflictList.length > 1)
80305               .attr('class', 'action conflicts-button col6')
80306               .text(t('save.title'))
80307               .on('click.try_again', tryAgain);
80308
80309           buttonsEnter
80310               .append('button')
80311               .attr('class', 'secondary-action conflicts-button col6')
80312               .text(t('confirm.cancel'))
80313               .on('click.cancel', cancel);
80314       }
80315
80316
80317       function showConflict(selection, index) {
80318           index = utilWrap(index, _conflictList.length);
80319
80320           var parent = select(selection.node().parentNode);
80321
80322           // enable save button if this is the last conflict being reviewed..
80323           if (index === _conflictList.length - 1) {
80324               window.setTimeout(function() {
80325                   parent.select('.conflicts-button')
80326                       .attr('disabled', null);
80327
80328                   parent.select('.conflicts-done')
80329                       .transition()
80330                       .attr('opacity', 1)
80331                       .style('display', 'block');
80332               }, 250);
80333           }
80334
80335           var conflict = selection
80336               .selectAll('.conflict')
80337               .data([_conflictList[index]]);
80338
80339           conflict.exit()
80340               .remove();
80341
80342           var conflictEnter = conflict.enter()
80343               .append('div')
80344               .attr('class', 'conflict');
80345
80346           conflictEnter
80347               .append('h4')
80348               .attr('class', 'conflict-count')
80349               .text(t('save.conflict.count', { num: index + 1, total: _conflictList.length }));
80350
80351           conflictEnter
80352               .append('a')
80353               .attr('class', 'conflict-description')
80354               .attr('href', '#')
80355               .text(function(d) { return d.name; })
80356               .on('click', function(d) {
80357                   event.preventDefault();
80358                   zoomToEntity(d.id);
80359               });
80360
80361           var details = conflictEnter
80362               .append('div')
80363               .attr('class', 'conflict-detail-container');
80364
80365           details
80366               .append('ul')
80367               .attr('class', 'conflict-detail-list')
80368               .selectAll('li')
80369               .data(function(d) { return d.details || []; })
80370               .enter()
80371               .append('li')
80372               .attr('class', 'conflict-detail-item')
80373               .html(function(d) { return d; });
80374
80375           details
80376               .append('div')
80377               .attr('class', 'conflict-choices')
80378               .call(addChoices);
80379
80380           details
80381               .append('div')
80382               .attr('class', 'conflict-nav-buttons joined cf')
80383               .selectAll('button')
80384               .data(['previous', 'next'])
80385               .enter()
80386               .append('button')
80387               .text(function(d) { return t('save.conflict.' + d); })
80388               .attr('class', 'conflict-nav-button action col6')
80389               .attr('disabled', function(d, i) {
80390                   return (i === 0 && index === 0) ||
80391                       (i === 1 && index === _conflictList.length - 1) || null;
80392               })
80393               .on('click', function(d, i) {
80394                   event.preventDefault();
80395
80396                   var container = parent.selectAll('.conflict-container');
80397                   var sign = (i === 0 ? -1 : 1);
80398
80399                   container
80400                       .selectAll('.conflict')
80401                       .remove();
80402
80403                   container
80404                       .call(showConflict, index + sign);
80405               });
80406
80407       }
80408
80409
80410       function addChoices(selection) {
80411           var choices = selection
80412               .append('ul')
80413               .attr('class', 'layer-list')
80414               .selectAll('li')
80415               .data(function(d) { return d.choices || []; });
80416
80417           // enter
80418           var choicesEnter = choices.enter()
80419               .append('li')
80420               .attr('class', 'layer');
80421
80422           var labelEnter = choicesEnter
80423               .append('label');
80424
80425           labelEnter
80426               .append('input')
80427               .attr('type', 'radio')
80428               .attr('name', function(d) { return d.id; })
80429               .on('change', function(d, i) {
80430                   var ul = this.parentNode.parentNode.parentNode;
80431                   ul.__data__.chosen = i;
80432                   choose(ul, d);
80433               });
80434
80435           labelEnter
80436               .append('span')
80437               .text(function(d) { return d.text; });
80438
80439           // update
80440           choicesEnter
80441               .merge(choices)
80442               .each(function(d, i) {
80443                   var ul = this.parentNode;
80444                   if (ul.__data__.chosen === i) {
80445                       choose(ul, d);
80446                   }
80447               });
80448       }
80449
80450
80451       function choose(ul, datum) {
80452           if (event) event.preventDefault();
80453
80454           select(ul)
80455               .selectAll('li')
80456               .classed('active', function(d) { return d === datum; })
80457               .selectAll('input')
80458               .property('checked', function(d) { return d === datum; });
80459
80460           var extent = geoExtent();
80461           var entity;
80462
80463           entity = context.graph().hasEntity(datum.id);
80464           if (entity) extent._extend(entity.extent(context.graph()));
80465
80466           datum.action();
80467
80468           entity = context.graph().hasEntity(datum.id);
80469           if (entity) extent._extend(entity.extent(context.graph()));
80470
80471           zoomToEntity(datum.id, extent);
80472       }
80473
80474
80475       function zoomToEntity(id, extent) {
80476           context.surface().selectAll('.hover')
80477               .classed('hover', false);
80478
80479           var entity = context.graph().hasEntity(id);
80480           if (entity) {
80481               if (extent) {
80482                   context.map().trimmedExtent(extent);
80483               } else {
80484                   context.map().zoomToEase(entity);
80485               }
80486               context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
80487                   .classed('hover', true);
80488           }
80489       }
80490
80491
80492       // The conflict list should be an array of objects like:
80493       // {
80494       //     id: id,
80495       //     name: entityName(local),
80496       //     details: merge.conflicts(),
80497       //     chosen: 1,
80498       //     choices: [
80499       //         choice(id, keepMine, forceLocal),
80500       //         choice(id, keepTheirs, forceRemote)
80501       //     ]
80502       // }
80503       conflicts.conflictList = function(_) {
80504           if (!arguments.length) return _conflictList;
80505           _conflictList = _;
80506           return conflicts;
80507       };
80508
80509
80510       conflicts.origChanges = function(_) {
80511           if (!arguments.length) return _origChanges;
80512           _origChanges = _;
80513           return conflicts;
80514       };
80515
80516
80517       return utilRebind(conflicts, dispatch$1, 'on');
80518   }
80519
80520   function uiDataEditor(context) {
80521       var dataHeader = uiDataHeader();
80522       var quickLinks = uiQuickLinks();
80523       var rawTagEditor = uiRawTagEditor(context);
80524       var _datum;
80525
80526
80527       function dataEditor(selection) {
80528           // quick links
80529           var choices = [{
80530               id: 'zoom_to',
80531               label: 'inspector.zoom_to.title',
80532               tooltip: function() {
80533                   return uiTooltipHtml(t('inspector.zoom_to.tooltip_data'), t('inspector.zoom_to.key'));
80534               },
80535               click: function zoomTo() {
80536                   context.mode().zoomToSelected();
80537               }
80538           }];
80539
80540
80541           var header = selection.selectAll('.header')
80542               .data([0]);
80543
80544           var headerEnter = header.enter()
80545               .append('div')
80546               .attr('class', 'header fillL');
80547
80548           headerEnter
80549               .append('button')
80550               .attr('class', 'fr data-editor-close')
80551               .on('click', function() {
80552                   context.enter(modeBrowse(context));
80553               })
80554               .call(svgIcon('#iD-icon-close'));
80555
80556           headerEnter
80557               .append('h3')
80558               .text(t('map_data.title'));
80559
80560
80561           var body = selection.selectAll('.body')
80562               .data([0]);
80563
80564           body = body.enter()
80565               .append('div')
80566               .attr('class', 'body')
80567               .merge(body);
80568
80569           var editor = body.selectAll('.data-editor')
80570               .data([0]);
80571
80572           editor.enter()
80573               .append('div')
80574               .attr('class', 'modal-section data-editor')
80575               .merge(editor)
80576               .call(dataHeader.datum(_datum))
80577               .call(quickLinks.choices(choices));
80578
80579           var rte = body.selectAll('.raw-tag-editor')
80580               .data([0]);
80581
80582           rte.enter()
80583               .append('div')
80584               .attr('class', 'raw-tag-editor inspector-inner data-editor')
80585               .merge(rte)
80586               .call(rawTagEditor
80587                   .expanded(true)
80588                   .readOnlyTags([/./])
80589                   .tags((_datum && _datum.properties) || {})
80590                   .state('hover')
80591               );
80592       }
80593
80594
80595       dataEditor.datum = function(val) {
80596           if (!arguments.length) return _datum;
80597           _datum = val;
80598           return this;
80599       };
80600
80601
80602       return dataEditor;
80603   }
80604
80605   function uiDataHeader() {
80606       var _datum;
80607
80608
80609       function dataHeader(selection) {
80610           var header = selection.selectAll('.data-header')
80611               .data(
80612                   (_datum ? [_datum] : []),
80613                   function(d) { return d.__featurehash__; }
80614               );
80615
80616           header.exit()
80617               .remove();
80618
80619           var headerEnter = header.enter()
80620               .append('div')
80621               .attr('class', 'data-header');
80622
80623           var iconEnter = headerEnter
80624               .append('div')
80625               .attr('class', 'data-header-icon');
80626
80627           iconEnter
80628               .append('div')
80629               .attr('class', 'preset-icon-28')
80630               .call(svgIcon('#iD-icon-data', 'note-fill'));
80631
80632           headerEnter
80633               .append('div')
80634               .attr('class', 'data-header-label')
80635               .text(t('map_data.layers.custom.title'));
80636       }
80637
80638
80639       dataHeader.datum = function(val) {
80640           if (!arguments.length) return _datum;
80641           _datum = val;
80642           return this;
80643       };
80644
80645
80646       return dataHeader;
80647   }
80648
80649   function uiEditMenu(context, operations) {
80650       var menu;
80651       var center = [0, 0];
80652       var offset = [0, 0];
80653       var tooltip;
80654
80655       var p = 8;               // top padding
80656       var m = 4;               // top margin
80657       var h = 15;              // height of icon
80658       var vpBottomMargin = 45; // viewport bottom margin
80659       var vpSideMargin = 35;   // viewport side margin
80660       var buttonWidth = 44;
80661       var buttonHeight = (2 * p + h);
80662       var menuWidth = buttonWidth;
80663       var menuHeight = (2 * m) + operations.length * buttonHeight;
80664       var menuSideMargin = 10;
80665       var tooltipWidth = 200;
80666       var tooltipHeight = 200;  // a reasonable guess, real height depends on tooltip contents
80667
80668
80669       var editMenu = function (selection) {
80670           if (!operations.length) return;
80671
80672           selection.node().parentNode.focus();
80673
80674           var isRTL = textDirection === 'rtl';
80675           var viewport = context.surfaceRect();
80676
80677           if (!isRTL && (center[0] + menuSideMargin + menuWidth) > (viewport.width - vpSideMargin)) {
80678               // menu is going left-to-right and near right viewport edge, go left instead
80679               isRTL = true;
80680           } else if (isRTL && (center[0] - menuSideMargin - menuWidth) < vpSideMargin) {
80681               // menu is going right-to-left and near left viewport edge, go right instead
80682               isRTL = false;
80683           }
80684
80685           offset[0] = (isRTL ? -1 * (menuSideMargin + menuWidth) : menuSideMargin);
80686
80687           if (center[1] + menuHeight > (viewport.height - vpBottomMargin)) {
80688               // menu is near bottom viewport edge, shift upwards
80689               offset[1] = -1 * (center[1] + menuHeight - viewport.height + vpBottomMargin);
80690           }
80691
80692           var origin = [ center[0] + offset[0], center[1] + offset[1] ];
80693
80694           menu = selection
80695               .append('g')
80696               .attr('class', 'edit-menu')
80697               .attr('transform', 'translate(' + origin + ')')
80698               .attr('opacity', 0);
80699
80700           menu
80701               .transition()
80702               .attr('opacity', 1);
80703
80704           menu
80705               .append('rect')
80706               .attr('class', 'edit-menu-background')
80707               .attr('x', 4)
80708               .attr('rx', 4)
80709               .attr('ry', 4)
80710               .attr('width', menuWidth)
80711               .attr('height', menuHeight)
80712               .attr('stroke-linecap', 'round');
80713
80714
80715           var button = menu.selectAll('.edit-menu-item')
80716               .data(operations)
80717               .enter()
80718               .append('g')
80719               .attr('class', function (d) { return 'edit-menu-item edit-menu-item-' + d.id; })
80720               .classed('disabled', function (d) { return d.disabled(); })
80721               .attr('transform', function (d, i) {
80722                   return 'translate(' + geoVecFloor([
80723                       0,
80724                       m + i * buttonHeight
80725                   ]).join(',') + ')';
80726               });
80727
80728           button
80729               .append('rect')
80730               .attr('x', 4)
80731               .attr('width', buttonWidth)
80732               .attr('height', buttonHeight)
80733               .on('click', click)
80734               .on('mousedown', mousedown)
80735               .on('mouseover', mouseover)
80736               .on('mouseout', mouseout);
80737
80738           button
80739               .append('use')
80740               .attr('width', '20')
80741               .attr('height', '20')
80742               .attr('transform', function () { return 'translate(' + [2 * p, 5] + ')'; })
80743               .attr('xlink:href', function (d) { return '#iD-operation-' + d.id; });
80744
80745           tooltip = select('#id-container')
80746               .append('div')
80747               .attr('class', 'tooltip-inner edit-menu-tooltip');
80748
80749
80750           function click(operation) {
80751               event.stopPropagation();
80752               if (operation.disabled()) return;
80753               operation();
80754               editMenu.close();
80755           }
80756
80757           function mousedown() {
80758               event.stopPropagation();  // https://github.com/openstreetmap/iD/issues/1869
80759           }
80760
80761           function mouseover(d, i) {
80762               var tipX, tipY;
80763
80764               if (!isRTL) {
80765                   tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
80766               } else {
80767                   tipX = viewport.left + origin[0] - 4 - tooltipWidth;
80768               }
80769
80770               if (tipX + tooltipWidth > viewport.right) {
80771                   // tip is going left-to-right and near right viewport edge, go left instead
80772                   tipX = viewport.left + origin[0] - 4 - tooltipWidth;
80773               } else if (tipX < viewport.left) {
80774                   // tip is going right-to-left and near left viewport edge, go right instead
80775                   tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
80776               }
80777
80778               tipY = viewport.top + origin[1] + (i * buttonHeight);
80779               if (tipY + tooltipHeight > viewport.bottom) {
80780                   // tip is near bottom viewport edge, shift upwards
80781                   tipY -= tipY + tooltipHeight - viewport.bottom;
80782               }
80783
80784               tooltip
80785                   .style('left', tipX + 'px')
80786                   .style('top', tipY + 'px')
80787                   .style('display', 'block')
80788                   .html(uiTooltipHtml(d.tooltip(), d.keys[0], d.title));
80789           }
80790
80791           function mouseout() {
80792               tooltip.style('display', 'none');
80793           }
80794       };
80795
80796
80797       editMenu.close = function () {
80798           if (menu) {
80799               menu
80800                   .style('pointer-events', 'none')
80801                   .transition()
80802                   .attr('opacity', 0)
80803                   .remove();
80804           }
80805
80806           if (tooltip) {
80807               tooltip.remove();
80808           }
80809       };
80810
80811
80812       editMenu.center = function (_) {
80813           if (!arguments.length) return center;
80814           center = _;
80815           return editMenu;
80816       };
80817
80818
80819       return editMenu;
80820   }
80821
80822   function uiPresetIcon() {
80823       var preset, geometry;
80824
80825
80826       function presetIcon(selection) {
80827           selection.each(render);
80828       }
80829
80830
80831       function getIcon(p, geom) {
80832           if (p.icon)
80833               return p.icon;
80834           else if (geom === 'line')
80835               return 'iD-other-line';
80836           else if (geom === 'vertex')
80837               return p.isFallback() ? '' : 'temaki-vertex';
80838           else
80839               return 'maki-marker-stroked';
80840       }
80841
80842
80843       function render() {
80844           var selection = select(this);
80845           var p = preset.apply(this, arguments);
80846           var geom = geometry.apply(this, arguments);
80847           var picon = getIcon(p, geom);
80848           var isMaki = /^maki-/.test(picon);
80849           var isTemaki = /^temaki-/.test(picon);
80850           var isFa = /^fa[srb]-/.test(picon);
80851           var isPOI = isMaki || isTemaki || isFa;
80852           var isCategory = !p.setTags;
80853           var drawLine = geom === 'line' && !isCategory;
80854           var isFramed = (geom === 'area' || drawLine || geom === 'vertex');
80855
80856           var tags = !isCategory ? p.setTags({}, geom) : {};
80857           for (var k in tags) {
80858               if (tags[k] === '*') {
80859                   tags[k] = 'yes';
80860               }
80861           }
80862           var tagClasses = svgTagClasses().getClassesString(tags, '');
80863
80864           var fill = selection.selectAll('.preset-icon-fill')
80865               .data([0]);
80866
80867           fill = fill.enter()
80868               .append('div')
80869               .merge(fill);
80870
80871           fill
80872               .attr('class', function() {
80873                   return 'preset-icon-fill preset-icon-fill-' + geom + ' ' + tagClasses;
80874               });
80875
80876           var line = selection.selectAll('.preset-icon-line')
80877               .data(drawLine ? [0] : []);
80878
80879           line.exit()
80880               .remove();
80881
80882           // draw the line parametrically
80883           var w = 60, h = 60, y = 43, l = 36, r = 2.5;
80884           var x1 = (w - l)/2, x2 = x1 + l;
80885
80886           var lineEnter = line.enter()
80887               .append('svg')
80888               .attr('class', 'preset-icon-line')
80889               .attr('width', w)
80890               .attr('height', h)
80891               .attr('viewBox', '0 0 ' + w + ' ' + h);
80892
80893           lineEnter.append('path')
80894               .attr('d', 'M' + x1 + ' ' + y + ' L' + x2 + ' ' + y)
80895               .attr('class', 'line casing');
80896           lineEnter.append('path')
80897               .attr('d', 'M' + x1 + ' ' + y + ' L' + x2 + ' ' + y)
80898               .attr('class', 'line stroke');
80899           lineEnter.append('circle')
80900               .attr('class', 'vertex')
80901               .attr('cx', x1 - 1)
80902               .attr('cy', y)
80903               .attr('r', r);
80904           lineEnter.append('circle')
80905               .attr('class', 'vertex')
80906               .attr('cx', x2 + 1)
80907               .attr('cy', y)
80908               .attr('r', r);
80909
80910           line = lineEnter.merge(line);
80911
80912           line.selectAll('path.stroke')
80913               .attr('class', 'line stroke ' + tagClasses);
80914           line.selectAll('path.casing')
80915               .attr('class', 'line casing ' + tagClasses);
80916
80917
80918           var areaFrame = selection.selectAll('.preset-icon-frame')
80919               .data((geom === 'area') ? [0] : []);
80920
80921           areaFrame.exit()
80922               .remove();
80923
80924           areaFrame = areaFrame.enter()
80925               .append('div')
80926               .attr('class', 'preset-icon-frame')
80927               .call(svgIcon('#iD-preset-icon-frame'));
80928
80929
80930           var icon = selection.selectAll('.preset-icon')
80931               .data([0]);
80932
80933           icon = icon.enter()
80934               .append('div')
80935               .attr('class', 'preset-icon')
80936               .call(svgIcon(''))
80937               .merge(icon);
80938
80939           icon
80940               .attr('class', 'preset-icon ' + geom + '-geom ' + 'preset-icon-' +
80941                   (isPOI ? (isFramed ? '24' : '28') : (isFramed ? '44' : '60'))
80942               );
80943
80944           icon.selectAll('svg')
80945               .attr('class', function() {
80946                   return 'icon ' + picon + ' ' + (isPOI && geom !== 'line'  ? '' : tagClasses);
80947               });
80948
80949           icon.selectAll('use')
80950               .attr('href', '#' + picon + (isMaki ? '-15' : ''));
80951       }
80952
80953
80954       presetIcon.preset = function(val) {
80955           if (!arguments.length) return preset;
80956           preset = utilFunctor(val);
80957           return presetIcon;
80958       };
80959
80960
80961       presetIcon.geometry = function(val) {
80962           if (!arguments.length) return geometry;
80963           geometry = utilFunctor(val);
80964           return presetIcon;
80965       };
80966
80967       return presetIcon;
80968   }
80969
80970   function uiQuickLinks() {
80971       var _choices = [];
80972
80973
80974       function quickLinks(selection) {
80975           var container = selection.selectAll('.quick-links')
80976               .data([0]);
80977
80978           container = container.enter()
80979               .append('div')
80980               .attr('class', 'quick-links')
80981               .merge(container);
80982
80983           var items = container.selectAll('.quick-link')
80984               .data(_choices, function(d) { return d.id; });
80985
80986           items.exit()
80987               .remove();
80988
80989           items.enter()
80990               .append('a')
80991               .attr('class', function(d) { return 'quick-link quick-link-' + d.id; })
80992               .attr('href', '#')
80993               .text(function(d) { return t(d.label); })
80994               .each(function(d) {
80995                   if (typeof d.tooltip !== 'function') return;
80996                   select(this)
80997                       .call(tooltip().html(true).title(d.tooltip).placement('bottom'));
80998               })
80999               .on('click', function(d) {
81000                   if (typeof d.click !== 'function') return;
81001                   event.preventDefault();
81002                   d.click(d);
81003               });
81004       }
81005
81006
81007       //  val should be an array of choices like:
81008       //    [{
81009       //       id: 'link-id',
81010       //       label: 'translation.key',
81011       //       tooltip: function(d),
81012       //       click: function(d)
81013       //    }, ..]
81014       quickLinks.choices = function(val) {
81015           if (!arguments.length) return _choices;
81016           _choices = val;
81017           return quickLinks;
81018       };
81019
81020
81021       return quickLinks;
81022   }
81023
81024   function uiRawMemberEditor(context) {
81025       var taginfo = services.taginfo;
81026       var _entityID;
81027
81028       function downloadMember(d) {
81029           event.preventDefault();
81030
81031           // display the loading indicator
81032           select(this.parentNode).classed('tag-reference-loading', true);
81033           context.loadEntity(d.id);
81034       }
81035
81036       function zoomToMember(d) {
81037           event.preventDefault();
81038
81039           var entity = context.entity(d.id);
81040           context.map().zoomTo(entity);
81041
81042           // highlight the feature in case it wasn't previously on-screen
81043           utilHighlightEntities([d.id], true, context);
81044       }
81045
81046
81047       function selectMember(d) {
81048           event.preventDefault();
81049
81050           // remove the hover-highlight styling
81051           utilHighlightEntities([d.id], false, context);
81052
81053           var entity = context.entity(d.id);
81054           var mapExtent = context.map().extent();
81055           if (!entity.intersects(mapExtent, context.graph())) {
81056               // zoom to the entity if its extent is not visible now
81057               context.map().zoomToEase(entity);
81058           }
81059
81060           context.enter(modeSelect(context, [d.id]));
81061       }
81062
81063
81064       function changeRole(d) {
81065           var oldRole = d.role;
81066           var newRole = select(this).property('value');
81067
81068           if (oldRole !== newRole) {
81069               var member = { id: d.id, type: d.type, role: newRole };
81070               context.perform(
81071                   actionChangeMember(d.relation.id, member, d.index),
81072                   t('operations.change_role.annotation')
81073               );
81074           }
81075       }
81076
81077
81078       function deleteMember(d) {
81079           context.perform(
81080               actionDeleteMember(d.relation.id, d.index),
81081               t('operations.delete_member.annotation')
81082           );
81083
81084           if (!context.hasEntity(d.relation.id)) {
81085               context.enter(modeBrowse(context));
81086           }
81087
81088           utilHighlightEntities([d.id], false, context);
81089       }
81090
81091
81092       function rawMemberEditor(selection) {
81093           var entity = context.entity(_entityID);
81094           var memberships = [];
81095
81096           entity.members.slice(0, 1000).forEach(function(member, index) {
81097               memberships.push({
81098                   index: index,
81099                   id: member.id,
81100                   type: member.type,
81101                   role: member.role,
81102                   relation: entity,
81103                   member: context.hasEntity(member.id)
81104               });
81105           });
81106
81107           var gt = entity.members.length > 1000 ? '>' : '';
81108           selection.call(uiDisclosure(context, 'raw_member_editor', true)
81109               .title(t('inspector.all_members') + ' (' + gt + memberships.length + ')')
81110               .expanded(true)
81111               .updatePreference(false)
81112               .on('toggled', function(expanded) {
81113                   if (expanded) {
81114                       selection.node().parentNode.scrollTop += 200;
81115                   }
81116               })
81117               .content(content)
81118           );
81119
81120
81121           function content(selection) {
81122               var list = selection.selectAll('.member-list')
81123                   .data([0]);
81124
81125               list = list.enter()
81126                   .append('ul')
81127                   .attr('class', 'member-list')
81128                   .merge(list);
81129
81130
81131               var items = list.selectAll('li')
81132                   .data(memberships, function(d) {
81133                       return osmEntity.key(d.relation) + ',' + d.index + ',' +
81134                           (d.member ? osmEntity.key(d.member) : 'incomplete');
81135                   });
81136
81137               items.exit()
81138                   .each(unbind)
81139                   .remove();
81140
81141               var itemsEnter = items.enter()
81142                   .append('li')
81143                   .attr('class', 'member-row form-field')
81144                   .classed('member-incomplete', function(d) { return !d.member; });
81145
81146               itemsEnter
81147                   .each(function(d) {
81148                       var item = select(this);
81149
81150                       var label = item
81151                           .append('label')
81152                           .attr('class', 'form-field-label');
81153
81154                       if (d.member) {
81155                           // highlight the member feature in the map while hovering on the list item
81156                           item
81157                               .on('mouseover', function() {
81158                                   utilHighlightEntities([d.id], true, context);
81159                               })
81160                               .on('mouseout', function() {
81161                                   utilHighlightEntities([d.id], false, context);
81162                               });
81163
81164                           var labelLink = label
81165                               .append('span')
81166                               .attr('class', 'label-text')
81167                               .append('a')
81168                               .attr('href', '#')
81169                               .on('click', selectMember);
81170
81171                           labelLink
81172                               .append('span')
81173                               .attr('class', 'member-entity-type')
81174                               .text(function(d) {
81175                                   var matched = context.presets().match(d.member, context.graph());
81176                                   return (matched && matched.name()) || utilDisplayType(d.member.id);
81177                               });
81178
81179                           labelLink
81180                               .append('span')
81181                               .attr('class', 'member-entity-name')
81182                               .text(function(d) { return utilDisplayName(d.member); });
81183
81184                           label
81185                               .append('button')
81186                               .attr('class', 'member-zoom')
81187                               .attr('title', t('icons.zoom_to'))
81188                               .attr('tabindex', -1)
81189                               .call(svgIcon('#iD-icon-geolocate'))
81190                               .on('click', zoomToMember);
81191
81192                       } else {
81193                           var labelText = label
81194                               .append('span')
81195                               .attr('class', 'label-text');
81196
81197                           labelText
81198                               .append('span')
81199                               .attr('class', 'member-entity-type')
81200                               .text(t('inspector.' + d.type, { id: d.id }));
81201
81202                           labelText
81203                               .append('span')
81204                               .attr('class', 'member-entity-name')
81205                               .text(t('inspector.incomplete', { id: d.id }));
81206
81207                           label
81208                               .append('button')
81209                               .attr('class', 'member-download')
81210                               .attr('title', t('icons.download'))
81211                               .attr('tabindex', -1)
81212                               .call(svgIcon('#iD-icon-load'))
81213                               .on('click', downloadMember);
81214                       }
81215                   });
81216
81217               var wrapEnter = itemsEnter
81218                   .append('div')
81219                   .attr('class', 'form-field-input-wrap form-field-input-member');
81220
81221               wrapEnter
81222                   .append('input')
81223                   .attr('class', 'member-role')
81224                   .property('type', 'text')
81225                   .attr('maxlength', 255)
81226                   .attr('placeholder', t('inspector.role'))
81227                   .call(utilNoAuto);
81228
81229               wrapEnter
81230                   .append('button')
81231                   .attr('tabindex', -1)
81232                   .attr('title', t('icons.remove'))
81233                   .attr('class', 'remove form-field-button member-delete')
81234                   .call(svgIcon('#iD-operation-delete'));
81235
81236               if (taginfo) {
81237                   wrapEnter.each(bindTypeahead);
81238               }
81239
81240
81241               // update
81242               items = items
81243                   .merge(itemsEnter);
81244
81245               items.select('input.member-role')
81246                   .property('value', function(d) { return d.role; })
81247                   .on('blur', changeRole)
81248                   .on('change', changeRole);
81249
81250               items.select('button.member-delete')
81251                   .on('click', deleteMember);
81252
81253
81254
81255               function bindTypeahead(d) {
81256                   var row = select(this);
81257                   var role = row.selectAll('input.member-role');
81258                   var origValue = role.property('value');
81259
81260                   function sort(value, data) {
81261                       var sameletter = [];
81262                       var other = [];
81263                       for (var i = 0; i < data.length; i++) {
81264                           if (data[i].value.substring(0, value.length) === value) {
81265                               sameletter.push(data[i]);
81266                           } else {
81267                               other.push(data[i]);
81268                           }
81269                       }
81270                       return sameletter.concat(other);
81271                   }
81272
81273                   role.call(uiCombobox(context, 'member-role')
81274                       .fetcher(function(role, callback) {
81275                           // The `geometry` param is used in the `taginfo.js` interface for
81276                           // filtering results, as a key into the `tag_members_fractions`
81277                           // object.  If we don't know the geometry because the member is
81278                           // not yet downloaded, it's ok to guess based on type.
81279                           var geometry;
81280                           if (d.member) {
81281                               geometry = context.geometry(d.member.id);
81282                           } else if (d.type === 'relation') {
81283                               geometry = 'relation';
81284                           } else if (d.type === 'way') {
81285                               geometry = 'line';
81286                           } else {
81287                               geometry = 'point';
81288                           }
81289
81290                           var rtype = entity.tags.type;
81291                           taginfo.roles({
81292                               debounce: true,
81293                               rtype: rtype || '',
81294                               geometry: geometry,
81295                               query: role
81296                           }, function(err, data) {
81297                               if (!err) callback(sort(role, data));
81298                           });
81299                       })
81300                       .on('cancel', function() {
81301                           role.property('value', origValue);
81302                       })
81303                   );
81304               }
81305
81306
81307               function unbind() {
81308                   var row = select(this);
81309
81310                   row.selectAll('input.member-role')
81311                       .call(uiCombobox.off);
81312               }
81313           }
81314       }
81315
81316
81317       rawMemberEditor.entityID = function(val) {
81318           if (!arguments.length) return _entityID;
81319           _entityID = val;
81320           return rawMemberEditor;
81321       };
81322
81323
81324       return rawMemberEditor;
81325   }
81326
81327   function uiRawMembershipEditor(context) {
81328       var taginfo = services.taginfo;
81329       var nearbyCombo = uiCombobox(context, 'parent-relation')
81330           .minItems(1)
81331           .fetcher(fetchNearbyRelations);
81332       var _inChange = false;
81333       var _entityID;
81334       var _showBlank;
81335
81336
81337       function selectRelation(d) {
81338           event.preventDefault();
81339
81340           // remove the hover-highlight styling
81341           utilHighlightEntities([d.relation.id], false, context);
81342
81343           context.enter(modeSelect(context, [d.relation.id]));
81344       }
81345
81346
81347       function changeRole(d) {
81348           if (d === 0) return;    // called on newrow (shoudn't happen)
81349           if (_inChange) return;  // avoid accidental recursive call #5731
81350
81351           var oldRole = d.member.role;
81352           var newRole = select(this).property('value');
81353
81354           if (oldRole !== newRole) {
81355               _inChange = true;
81356               context.perform(
81357                   actionChangeMember(d.relation.id, assignIn({}, d.member, { role: newRole }), d.index),
81358                   t('operations.change_role.annotation')
81359               );
81360           }
81361           _inChange = false;
81362       }
81363
81364
81365       function addMembership(d, role) {
81366           this.blur();           // avoid keeping focus on the button
81367           _showBlank = false;
81368
81369           var member = { id: _entityID, type: context.entity(_entityID).type, role: role };
81370
81371           if (d.relation) {
81372               context.perform(
81373                   actionAddMember(d.relation.id, member),
81374                   t('operations.add_member.annotation')
81375               );
81376
81377           } else {
81378               var relation = osmRelation();
81379               context.perform(
81380                   actionAddEntity(relation),
81381                   actionAddMember(relation.id, member),
81382                   t('operations.add.annotation.relation')
81383               );
81384
81385               context.enter(modeSelect(context, [relation.id]).newFeature(true));
81386           }
81387       }
81388
81389
81390       function deleteMembership(d) {
81391           this.blur();           // avoid keeping focus on the button
81392           if (d === 0) return;   // called on newrow (shoudn't happen)
81393
81394           context.perform(
81395               actionDeleteMember(d.relation.id, d.index),
81396               t('operations.delete_member.annotation')
81397           );
81398       }
81399
81400
81401       function fetchNearbyRelations(q, callback) {
81402           var newRelation = { relation: null, value: t('inspector.new_relation') };
81403           var result = [];
81404           var graph = context.graph();
81405
81406           context.intersects(context.extent()).forEach(function(entity) {
81407               if (entity.type !== 'relation' || entity.id === _entityID) return;
81408
81409               var matched = context.presets().match(entity, graph);
81410               var presetName = (matched && matched.name()) || t('inspector.relation');
81411               var entityName = utilDisplayName(entity) || '';
81412
81413               var value = presetName + ' ' + entityName;
81414               if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1) return;
81415
81416               result.push({ relation: entity, value: value });
81417           });
81418
81419           result.sort(function(a, b) {
81420               return osmRelation.creationOrder(a.relation, b.relation);
81421           });
81422
81423           // Dedupe identical names by appending relation id - see #2891
81424           var dupeGroups = filter(
81425               groupBy(result, 'value'),
81426               function(v) { return v.length > 1; }
81427           );
81428
81429           dupeGroups.forEach(function(group) {
81430               group.forEach(function(obj) {
81431                   obj.value += ' ' + obj.relation.id;
81432               });
81433           });
81434
81435           result.forEach(function(obj) {
81436               obj.title = obj.value;
81437           });
81438
81439           result.unshift(newRelation);
81440           callback(result);
81441       }
81442
81443
81444       function rawMembershipEditor(selection) {
81445           var entity = context.entity(_entityID);
81446           var parents = context.graph().parentRelations(entity);
81447           var memberships = [];
81448
81449           parents.slice(0, 1000).forEach(function(relation) {
81450               relation.members.forEach(function(member, index) {
81451                   if (member.id === entity.id) {
81452                       memberships.push({ relation: relation, member: member, index: index });
81453                   }
81454               });
81455           });
81456
81457           var gt = parents.length > 1000 ? '>' : '';
81458           selection.call(uiDisclosure(context, 'raw_membership_editor', true)
81459               .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
81460               .expanded(true)
81461               .updatePreference(false)
81462               .on('toggled', function(expanded) {
81463                   if (expanded) { selection.node().parentNode.scrollTop += 200; }
81464               })
81465               .content(content)
81466           );
81467
81468
81469           function content(selection) {
81470               var list = selection.selectAll('.member-list')
81471                   .data([0]);
81472
81473               list = list.enter()
81474                   .append('ul')
81475                   .attr('class', 'member-list')
81476                   .merge(list);
81477
81478
81479               var items = list.selectAll('li.member-row-normal')
81480                   .data(memberships, function(d) {
81481                       return osmEntity.key(d.relation) + ',' + d.index;
81482                   });
81483
81484               items.exit()
81485                   .each(unbind)
81486                   .remove();
81487
81488               // Enter
81489               var itemsEnter = items.enter()
81490                   .append('li')
81491                   .attr('class', 'member-row member-row-normal form-field');
81492
81493               itemsEnter.each(function(d){
81494                   // highlight the relation in the map while hovering on the list item
81495                   select(this)
81496                       .on('mouseover', function() {
81497                           utilHighlightEntities([d.relation.id], true, context);
81498                       })
81499                       .on('mouseout', function() {
81500                           utilHighlightEntities([d.relation.id], false, context);
81501                       });
81502               });
81503
81504               var labelEnter = itemsEnter
81505                   .append('label')
81506                   .attr('class', 'form-field-label')
81507                   .append('span')
81508                   .attr('class', 'label-text')
81509                   .append('a')
81510                   .attr('href', '#')
81511                   .on('click', selectRelation);
81512
81513               labelEnter
81514                   .append('span')
81515                   .attr('class', 'member-entity-type')
81516                   .text(function(d) {
81517                       var matched = context.presets().match(d.relation, context.graph());
81518                       return (matched && matched.name()) || t('inspector.relation');
81519                   });
81520
81521               labelEnter
81522                   .append('span')
81523                   .attr('class', 'member-entity-name')
81524                   .text(function(d) { return utilDisplayName(d.relation); });
81525
81526               var wrapEnter = itemsEnter
81527                   .append('div')
81528                   .attr('class', 'form-field-input-wrap form-field-input-member');
81529
81530               wrapEnter
81531                   .append('input')
81532                   .attr('class', 'member-role')
81533                   .property('type', 'text')
81534                   .attr('maxlength', 255)
81535                   .attr('placeholder', t('inspector.role'))
81536                   .call(utilNoAuto)
81537                   .property('value', function(d) { return d.member.role; })
81538                   .on('blur', changeRole)
81539                   .on('change', changeRole);
81540
81541               wrapEnter
81542                   .append('button')
81543                   .attr('tabindex', -1)
81544                   .attr('class', 'remove form-field-button member-delete')
81545                   .call(svgIcon('#iD-operation-delete'))
81546                   .on('click', deleteMembership);
81547
81548               if (taginfo) {
81549                   wrapEnter.each(bindTypeahead);
81550               }
81551
81552
81553               var newMembership = list.selectAll('.member-row-new')
81554                   .data(_showBlank ? [0] : []);
81555
81556               // Exit
81557               newMembership.exit()
81558                   .remove();
81559
81560               // Enter
81561               var newMembershipEnter = newMembership.enter()
81562                   .append('li')
81563                   .attr('class', 'member-row member-row-new form-field');
81564
81565               newMembershipEnter
81566                   .append('label')
81567                   .attr('class', 'form-field-label')
81568                   .append('input')
81569                   .attr('placeholder', t('inspector.choose_relation'))
81570                   .attr('type', 'text')
81571                   .attr('class', 'member-entity-input')
81572                   .call(utilNoAuto);
81573
81574               var newWrapEnter = newMembershipEnter
81575                   .append('div')
81576                   .attr('class', 'form-field-input-wrap form-field-input-member');
81577
81578               newWrapEnter
81579                   .append('input')
81580                   .attr('class', 'member-role')
81581                   .property('type', 'text')
81582                   .attr('maxlength', 255)
81583                   .attr('placeholder', t('inspector.role'))
81584                   .call(utilNoAuto);
81585
81586               newWrapEnter
81587                   .append('button')
81588                   .attr('tabindex', -1)
81589                   .attr('class', 'remove form-field-button member-delete')
81590                   .call(svgIcon('#iD-operation-delete'))
81591                   .on('click', function() {
81592                       list.selectAll('.member-row-new')
81593                           .remove();
81594                   });
81595
81596               // Update
81597               newMembership = newMembership
81598                   .merge(newMembershipEnter);
81599
81600               newMembership.selectAll('.member-entity-input')
81601                   .on('blur', cancelEntity)   // if it wasn't accepted normally, cancel it
81602                   .call(nearbyCombo
81603                       .on('accept', acceptEntity)
81604                       .on('cancel', cancelEntity)
81605                   );
81606
81607
81608               // Container for the Add button
81609               var addRow = selection.selectAll('.add-row')
81610                   .data([0]);
81611
81612               // enter
81613               var addRowEnter = addRow.enter()
81614                   .append('div')
81615                   .attr('class', 'add-row');
81616
81617               addRowEnter
81618                   .append('button')
81619                   .attr('class', 'add-relation')
81620                   .call(svgIcon('#iD-icon-plus', 'light'));
81621
81622               addRowEnter
81623                   .append('div')
81624                   .attr('class', 'space-value');   // preserve space
81625
81626               addRowEnter
81627                   .append('div')
81628                   .attr('class', 'space-buttons');  // preserve space
81629
81630               // update
81631               addRow = addRow
81632                   .merge(addRowEnter);
81633
81634               addRow.select('.add-relation')
81635                   .on('click', function() {
81636                       _showBlank = true;
81637                       content(selection);
81638                       list.selectAll('.member-entity-input').node().focus();
81639                   });
81640
81641
81642               function acceptEntity(d) {
81643                   if (!d) {
81644                       cancelEntity();
81645                       return;
81646                   }
81647                   var role = list.selectAll('.member-row-new .member-role').property('value');
81648                   addMembership(d, role);
81649               }
81650
81651
81652               function cancelEntity() {
81653                   var input = newMembership.selectAll('.member-entity-input');
81654                   input.property('value', '');
81655               }
81656
81657
81658               function bindTypeahead(d) {
81659                   var row = select(this);
81660                   var role = row.selectAll('input.member-role');
81661                   var origValue = role.property('value');
81662
81663                   function sort(value, data) {
81664                       var sameletter = [];
81665                       var other = [];
81666                       for (var i = 0; i < data.length; i++) {
81667                           if (data[i].value.substring(0, value.length) === value) {
81668                               sameletter.push(data[i]);
81669                           } else {
81670                               other.push(data[i]);
81671                           }
81672                       }
81673                       return sameletter.concat(other);
81674                   }
81675
81676                   role.call(uiCombobox(context, 'member-role')
81677                       .fetcher(function(role, callback) {
81678                           var rtype = d.relation.tags.type;
81679                           taginfo.roles({
81680                               debounce: true,
81681                               rtype: rtype || '',
81682                               geometry: context.geometry(_entityID),
81683                               query: role
81684                           }, function(err, data) {
81685                               if (!err) callback(sort(role, data));
81686                           });
81687                       })
81688                       .on('cancel', function() {
81689                           role.property('value', origValue);
81690                       })
81691                   );
81692               }
81693
81694
81695               function unbind() {
81696                   var row = select(this);
81697
81698                   row.selectAll('input.member-role')
81699                       .call(uiCombobox.off);
81700               }
81701           }
81702       }
81703
81704
81705       rawMembershipEditor.entityID = function(val) {
81706           if (!arguments.length) return _entityID;
81707           _entityID = val;
81708           _showBlank = false;
81709           return rawMembershipEditor;
81710       };
81711
81712
81713       return rawMembershipEditor;
81714   }
81715
81716   // Pass `which` object of the form:
81717   // {
81718   //   key: 'string',     // required
81719   //   value: 'string'    // optional
81720   // }
81721   //   -or-
81722   // {
81723   //   rtype: 'string'    // relation type  (e.g. 'multipolygon')
81724   // }
81725   //   -or-
81726   // {
81727   //   qid: 'string'      // brand wikidata  (e.g. 'Q37158')
81728   // }
81729   //
81730   function uiTagReference(what) {
81731       var wikibase = what.qid ? services.wikidata : services.osmWikibase;
81732       var tagReference = {};
81733
81734       var _button = select(null);
81735       var _body = select(null);
81736       var _loaded;
81737       var _showing;
81738
81739
81740       function load() {
81741           if (!wikibase) return;
81742
81743           _button
81744               .classed('tag-reference-loading', true);
81745
81746           wikibase.getDocs(what, gotDocs);
81747       }
81748
81749
81750       function gotDocs(err, docs) {
81751           _body.html('');
81752
81753           if (!docs || !docs.title) {
81754               _body
81755                   .append('p')
81756                   .attr('class', 'tag-reference-description')
81757                   .text(t('inspector.no_documentation_key'));
81758               done();
81759               return;
81760           }
81761
81762           if (docs.imageURL) {
81763               _body
81764                   .append('img')
81765                   .attr('class', 'tag-reference-wiki-image')
81766                   .attr('src', docs.imageURL)
81767                   .on('load', function() { done(); })
81768                   .on('error', function() { select(this).remove(); done(); });
81769           } else {
81770               done();
81771           }
81772
81773           _body
81774               .append('p')
81775               .attr('class', 'tag-reference-description')
81776               .text(docs.description || t('inspector.no_documentation_key'))
81777               .append('a')
81778               .attr('class', 'tag-reference-edit')
81779               .attr('target', '_blank')
81780               .attr('tabindex', -1)
81781               .attr('title', t('inspector.edit_reference'))
81782               .attr('href', docs.editURL)
81783               .call(svgIcon('#iD-icon-edit', 'inline'));
81784
81785           if (docs.wiki) {
81786               _body
81787                 .append('a')
81788                 .attr('class', 'tag-reference-link')
81789                 .attr('target', '_blank')
81790                 .attr('tabindex', -1)
81791                 .attr('href', docs.wiki.url)
81792                 .call(svgIcon('#iD-icon-out-link', 'inline'))
81793                 .append('span')
81794                 .text(t(docs.wiki.text));
81795           }
81796
81797           // Add link to info about "good changeset comments" - #2923
81798           if (what.key === 'comment') {
81799               _body
81800                   .append('a')
81801                   .attr('class', 'tag-reference-comment-link')
81802                   .attr('target', '_blank')
81803                   .attr('tabindex', -1)
81804                   .call(svgIcon('#iD-icon-out-link', 'inline'))
81805                   .attr('href', t('commit.about_changeset_comments_link'))
81806                   .append('span')
81807                   .text(t('commit.about_changeset_comments'));
81808           }
81809       }
81810
81811
81812       function done() {
81813           _loaded = true;
81814
81815           _button
81816               .classed('tag-reference-loading', false);
81817
81818           _body
81819               .classed('expanded', true)
81820               .transition()
81821               .duration(200)
81822               .style('max-height', '200px')
81823               .style('opacity', '1');
81824
81825           _showing = true;
81826       }
81827
81828
81829       function hide() {
81830           _body
81831               .transition()
81832               .duration(200)
81833               .style('max-height', '0px')
81834               .style('opacity', '0')
81835               .on('end', function () {
81836                   _body.classed('expanded', false);
81837               });
81838
81839           _showing = false;
81840       }
81841
81842
81843       tagReference.button = function(selection) {
81844           _button = selection.selectAll('.tag-reference-button')
81845               .data([0]);
81846
81847           _button = _button.enter()
81848               .append('button')
81849               .attr('class', 'tag-reference-button')
81850               .attr('title', t('icons.information'))
81851               .attr('tabindex', -1)
81852               .call(svgIcon('#iD-icon-inspect'))
81853               .merge(_button);
81854
81855           _button
81856               .on('click', function () {
81857                   event.stopPropagation();
81858                   event.preventDefault();
81859                   this.blur();    // avoid keeping focus on the button - #4641
81860                   if (_showing) {
81861                       hide();
81862                   } else if (_loaded) {
81863                       done();
81864                   } else {
81865                       load();
81866                   }
81867               });
81868       };
81869
81870
81871       tagReference.body = function(selection) {
81872           var itemID = what.qid || what.rtype || (what.key + '-' + what.value);
81873           _body = selection.selectAll('.tag-reference-body')
81874               .data([itemID], function(d) { return d; });
81875
81876           _body.exit()
81877               .remove();
81878
81879           _body = _body.enter()
81880               .append('div')
81881               .attr('class', 'tag-reference-body')
81882               .style('max-height', '0')
81883               .style('opacity', '0')
81884               .merge(_body);
81885
81886           if (_showing === false) {
81887               hide();
81888           }
81889       };
81890
81891
81892       tagReference.showing = function(val) {
81893           if (!arguments.length) return _showing;
81894           _showing = val;
81895           return tagReference;
81896       };
81897
81898
81899       return tagReference;
81900   }
81901
81902   // This currently only works with the 'restrictions' field
81903   // It borrows some code from uiHelp
81904
81905   function uiFieldHelp(context, fieldName) {
81906       var fieldHelp = {};
81907       var _inspector = select(null);
81908       var _wrap = select(null);
81909       var _body = select(null);
81910
81911       var fieldHelpKeys = {
81912           restrictions: [
81913               ['about',[
81914                   'about',
81915                   'from_via_to',
81916                   'maxdist',
81917                   'maxvia'
81918               ]],
81919               ['inspecting',[
81920                   'about',
81921                   'from_shadow',
81922                   'allow_shadow',
81923                   'restrict_shadow',
81924                   'only_shadow',
81925                   'restricted',
81926                   'only'
81927               ]],
81928               ['modifying',[
81929                   'about',
81930                   'indicators',
81931                   'allow_turn',
81932                   'restrict_turn',
81933                   'only_turn'
81934               ]],
81935               ['tips',[
81936                   'simple',
81937                   'simple_example',
81938                   'indirect',
81939                   'indirect_example',
81940                   'indirect_noedit'
81941               ]]
81942           ]
81943       };
81944
81945       var fieldHelpHeadings = {};
81946
81947       var replacements = {
81948           distField: t('restriction.controls.distance'),
81949           viaField: t('restriction.controls.via'),
81950           fromShadow: icon('#iD-turn-shadow', 'pre-text shadow from'),
81951           allowShadow: icon('#iD-turn-shadow', 'pre-text shadow allow'),
81952           restrictShadow: icon('#iD-turn-shadow', 'pre-text shadow restrict'),
81953           onlyShadow: icon('#iD-turn-shadow', 'pre-text shadow only'),
81954           allowTurn: icon('#iD-turn-yes', 'pre-text turn'),
81955           restrictTurn: icon('#iD-turn-no', 'pre-text turn'),
81956           onlyTurn: icon('#iD-turn-only', 'pre-text turn')
81957       };
81958
81959
81960       // For each section, squash all the texts into a single markdown document
81961       var docs = fieldHelpKeys[fieldName].map(function(key) {
81962           var helpkey = 'help.field.' + fieldName + '.' + key[0];
81963           var text = key[1].reduce(function(all, part) {
81964               var subkey = helpkey + '.' + part;
81965               var depth = fieldHelpHeadings[subkey];                     // is this subkey a heading?
81966               var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
81967               return all + hhh + t(subkey, replacements) + '\n\n';
81968           }, '');
81969
81970           return {
81971               key: helpkey,
81972               title: t(helpkey + '.title'),
81973               html: marked(text.trim())
81974           };
81975       });
81976
81977
81978       function show() {
81979           updatePosition();
81980
81981           _body
81982               .classed('hide', false)
81983               .style('opacity', '0')
81984               .transition()
81985               .duration(200)
81986               .style('opacity', '1');
81987       }
81988
81989
81990       function hide() {
81991           _body
81992               .classed('hide', true)
81993               .transition()
81994               .duration(200)
81995               .style('opacity', '0')
81996               .on('end', function () {
81997                   _body.classed('hide', true);
81998               });
81999       }
82000
82001
82002       function clickHelp(index) {
82003           var d = docs[index];
82004           var tkeys = fieldHelpKeys[fieldName][index][1];
82005
82006           _body.selectAll('.field-help-nav-item')
82007               .classed('active', function(d, i) { return i === index; });
82008
82009           var content = _body.selectAll('.field-help-content')
82010               .html(d.html);
82011
82012           // class the paragraphs so we can find and style them
82013           content.selectAll('p')
82014               .attr('class', function(d, i) { return tkeys[i]; });
82015
82016           // insert special content for certain help sections
82017           if (d.key === 'help.field.restrictions.inspecting') {
82018               content
82019                   .insert('img', 'p.from_shadow')
82020                   .attr('class', 'field-help-image cf')
82021                   .attr('src', context.imagePath('tr_inspect.gif'));
82022
82023           } else if (d.key === 'help.field.restrictions.modifying') {
82024               content
82025                   .insert('img', 'p.allow_turn')
82026                   .attr('class', 'field-help-image cf')
82027                   .attr('src', context.imagePath('tr_modify.gif'));
82028           }
82029       }
82030
82031
82032       fieldHelp.button = function(selection) {
82033           if (_body.empty()) return;
82034
82035           var button = selection.selectAll('.field-help-button')
82036               .data([0]);
82037
82038           // enter/update
82039           button.enter()
82040               .append('button')
82041               .attr('class', 'field-help-button')
82042               .attr('tabindex', -1)
82043               .call(svgIcon('#iD-icon-help'))
82044               .merge(button)
82045               .on('click', function () {
82046                   event.stopPropagation();
82047                   event.preventDefault();
82048                   if (_body.classed('hide')) {
82049                       show();
82050                   } else {
82051                       hide();
82052                   }
82053               });
82054       };
82055
82056
82057       function updatePosition() {
82058           var wrap = _wrap.node();
82059           var inspector = _inspector.node();
82060           var wRect = wrap.getBoundingClientRect();
82061           var iRect = inspector.getBoundingClientRect();
82062
82063           _body
82064               .style('top', wRect.top + inspector.scrollTop - iRect.top + 'px');
82065       }
82066
82067
82068       fieldHelp.body = function(selection) {
82069           // This control expects the field to have a form-field-input-wrap div
82070           _wrap = selection.selectAll('.form-field-input-wrap');
82071           if (_wrap.empty()) return;
82072
82073           // absolute position relative to the inspector, so it "floats" above the fields
82074           _inspector = select('#sidebar .entity-editor-pane .inspector-body');
82075           if (_inspector.empty()) return;
82076
82077           _body = _inspector.selectAll('.field-help-body')
82078               .data([0]);
82079
82080           var enter = _body.enter()
82081               .append('div')
82082               .attr('class', 'field-help-body hide');   // initially hidden
82083
82084           var titleEnter = enter
82085               .append('div')
82086               .attr('class', 'field-help-title cf');
82087
82088           titleEnter
82089               .append('h2')
82090               .attr('class', ((textDirection === 'rtl') ? 'fr' : 'fl'))
82091               .text(t('help.field.' + fieldName + '.title'));
82092
82093           titleEnter
82094               .append('button')
82095               .attr('class', 'fr close')
82096               .on('click', function() {
82097                   event.stopPropagation();
82098                   event.preventDefault();
82099                   hide();
82100               })
82101               .call(svgIcon('#iD-icon-close'));
82102
82103           var navEnter = enter
82104               .append('div')
82105               .attr('class', 'field-help-nav cf');
82106
82107           var titles = docs.map(function(d) { return d.title; });
82108           navEnter.selectAll('.field-help-nav-item')
82109               .data(titles)
82110               .enter()
82111               .append('div')
82112               .attr('class', 'field-help-nav-item')
82113               .text(function(d) { return d; })
82114               .on('click', function(d, i) {
82115                   event.stopPropagation();
82116                   event.preventDefault();
82117                   clickHelp(i);
82118               });
82119
82120           enter
82121               .append('div')
82122               .attr('class', 'field-help-content');
82123
82124           _body = _body
82125               .merge(enter);
82126
82127           clickHelp(0);
82128       };
82129
82130
82131       return fieldHelp;
82132   }
82133
82134   function uiFieldCheck(field, context) {
82135       var dispatch$1 = dispatch('change');
82136       var options = field.strings && field.strings.options;
82137       var values = [];
82138       var texts = [];
82139
82140       var input = select(null);
82141       var text = select(null);
82142       var label = select(null);
82143       var reverser = select(null);
82144
82145       var _impliedYes;
82146       var _entityID;
82147       var _value;
82148
82149
82150       if (options) {
82151           for (var k in options) {
82152               values.push(k === 'undefined' ? undefined : k);
82153               texts.push(field.t('options.' + k, { 'default': options[k] }));
82154           }
82155       } else {
82156           values = [undefined, 'yes'];
82157           texts = [t('inspector.unknown'), t('inspector.check.yes')];
82158           if (field.type !== 'defaultCheck') {
82159               values.push('no');
82160               texts.push(t('inspector.check.no'));
82161           }
82162       }
82163
82164
82165       // Checks tags to see whether an undefined value is "Assumed to be Yes"
82166       function checkImpliedYes() {
82167           _impliedYes = (field.id === 'oneway_yes');
82168
82169           // hack: pretend `oneway` field is a `oneway_yes` field
82170           // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
82171           if (field.id === 'oneway') {
82172               var entity = context.entity(_entityID);
82173               for (var key in entity.tags) {
82174                   if (key in osmOneWayTags && (entity.tags[key] in osmOneWayTags[key])) {
82175                       _impliedYes = true;
82176                       texts[0] = t('presets.fields.oneway_yes.options.undefined');
82177                       break;
82178                   }
82179               }
82180           }
82181       }
82182
82183
82184       function reverserHidden() {
82185           if (!select('div.inspector-hover').empty()) return true;
82186           return !(_value === 'yes' || (_impliedYes && !_value));
82187       }
82188
82189
82190       function reverserSetText(selection) {
82191           var entity = context.hasEntity(_entityID);
82192           if (reverserHidden() || !entity) return selection;
82193
82194           var first = entity.first();
82195           var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
82196           var pseudoDirection = first < last;
82197           var icon = pseudoDirection ? '#iD-icon-forward' : '#iD-icon-backward';
82198
82199           selection.selectAll('.reverser-span')
82200               .text(t('inspector.check.reverser'))
82201               .call(svgIcon(icon, 'inline'));
82202
82203           return selection;
82204       }
82205
82206
82207       var check = function(selection) {
82208           checkImpliedYes();
82209
82210           label = selection.selectAll('.form-field-input-wrap')
82211               .data([0]);
82212
82213           var enter = label.enter()
82214               .append('label')
82215               .attr('class', 'form-field-input-wrap form-field-input-check');
82216
82217           enter
82218               .append('input')
82219               .property('indeterminate', field.type !== 'defaultCheck')
82220               .attr('type', 'checkbox')
82221               .attr('id', 'preset-input-' + field.safeid);
82222
82223           enter
82224               .append('span')
82225               .text(texts[0])
82226               .attr('class', 'value');
82227
82228           if (field.type === 'onewayCheck') {
82229               enter
82230                   .append('a')
82231                   .attr('id', 'preset-input-' + field.safeid + '-reverser')
82232                   .attr('class', 'reverser button' + (reverserHidden() ? ' hide' : ''))
82233                   .attr('href', '#')
82234                   .append('span')
82235                   .attr('class', 'reverser-span');
82236           }
82237
82238           label = label.merge(enter);
82239           input = label.selectAll('input');
82240           text = label.selectAll('span.value');
82241
82242           input
82243               .on('click', function() {
82244                   event.stopPropagation();
82245                   var t = {};
82246                   t[field.key] = values[(values.indexOf(_value) + 1) % values.length];
82247
82248                   // Don't cycle through `alternating` or `reversible` states - #4970
82249                   // (They are supported as translated strings, but should not toggle with clicks)
82250                   if (t[field.key] === 'reversible' || t[field.key] === 'alternating') {
82251                       t[field.key] = values[0];
82252                   }
82253
82254                   dispatch$1.call('change', this, t);
82255               });
82256
82257           if (field.type === 'onewayCheck') {
82258               reverser = label.selectAll('.reverser');
82259
82260               reverser
82261                   .call(reverserSetText)
82262                   .on('click', function() {
82263                       event.preventDefault();
82264                       event.stopPropagation();
82265                       context.perform(
82266                           actionReverse(_entityID),
82267                           t('operations.reverse.annotation')
82268                       );
82269                       select(this)
82270                           .call(reverserSetText);
82271                   });
82272           }
82273       };
82274
82275
82276       check.entity = function(_) {
82277           if (!arguments.length) return context.hasEntity(_entityID);
82278           _entityID = _.id;
82279           return check;
82280       };
82281
82282
82283       check.tags = function(tags) {
82284
82285           function isChecked(val) {
82286               return val !== 'no' && val !== '' && val !== undefined && val !== null;
82287           }
82288
82289           function textFor(val) {
82290               if (val === '') val = undefined;
82291               var index = values.indexOf(val);
82292               return (index !== -1 ? texts[index] : ('"' + val + '"'));
82293           }
82294
82295           checkImpliedYes();
82296           _value = tags[field.key] && tags[field.key].toLowerCase();
82297
82298           if (field.type === 'onewayCheck' && (_value === '1' || _value === '-1')) {
82299               _value = 'yes';
82300           }
82301
82302           input
82303               .property('indeterminate', field.type !== 'defaultCheck' && !_value)
82304               .property('checked', isChecked(_value));
82305
82306           text
82307               .text(textFor(_value));
82308
82309           label
82310               .classed('set', !!_value);
82311
82312           if (field.type === 'onewayCheck') {
82313               reverser
82314                   .classed('hide', reverserHidden())
82315                   .call(reverserSetText);
82316           }
82317       };
82318
82319
82320       check.focus = function() {
82321           input.node().focus();
82322       };
82323
82324       return utilRebind(check, dispatch$1, 'on');
82325   }
82326
82327   /** Used for built-in method references. */
82328   var arrayProto$1 = Array.prototype;
82329
82330   /** Built-in value references. */
82331   var splice$1 = arrayProto$1.splice;
82332
82333   /**
82334    * The base implementation of `_.pullAt` without support for individual
82335    * indexes or capturing the removed elements.
82336    *
82337    * @private
82338    * @param {Array} array The array to modify.
82339    * @param {number[]} indexes The indexes of elements to remove.
82340    * @returns {Array} Returns `array`.
82341    */
82342   function basePullAt(array, indexes) {
82343     var length = array ? indexes.length : 0,
82344         lastIndex = length - 1;
82345
82346     while (length--) {
82347       var index = indexes[length];
82348       if (length == lastIndex || index !== previous) {
82349         var previous = index;
82350         if (isIndex(index)) {
82351           splice$1.call(array, index, 1);
82352         } else {
82353           baseUnset(array, index);
82354         }
82355       }
82356     }
82357     return array;
82358   }
82359
82360   /**
82361    * Removes all elements from `array` that `predicate` returns truthy for
82362    * and returns an array of the removed elements. The predicate is invoked
82363    * with three arguments: (value, index, array).
82364    *
82365    * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
82366    * to pull elements from an array by value.
82367    *
82368    * @static
82369    * @memberOf _
82370    * @since 2.0.0
82371    * @category Array
82372    * @param {Array} array The array to modify.
82373    * @param {Function} [predicate=_.identity] The function invoked per iteration.
82374    * @returns {Array} Returns the new array of removed elements.
82375    * @example
82376    *
82377    * var array = [1, 2, 3, 4];
82378    * var evens = _.remove(array, function(n) {
82379    *   return n % 2 == 0;
82380    * });
82381    *
82382    * console.log(array);
82383    * // => [1, 3]
82384    *
82385    * console.log(evens);
82386    * // => [2, 4]
82387    */
82388   function remove$8(array, predicate) {
82389     var result = [];
82390     if (!(array && array.length)) {
82391       return result;
82392     }
82393     var index = -1,
82394         indexes = [],
82395         length = array.length;
82396
82397     predicate = baseIteratee(predicate, 3);
82398     while (++index < length) {
82399       var value = array[index];
82400       if (predicate(value, index, array)) {
82401         result.push(value);
82402         indexes.push(index);
82403       }
82404     }
82405     basePullAt(array, indexes);
82406     return result;
82407   }
82408
82409   function uiFieldCombo(field, context) {
82410       var dispatch$1 = dispatch('change');
82411       var nominatim = services.geocoder;
82412       var taginfo = services.taginfo;
82413       var isMulti = (field.type === 'multiCombo');
82414       var isNetwork = (field.type === 'networkCombo');
82415       var isSemi = (field.type === 'semiCombo');
82416       var optstrings = field.strings && field.strings.options;
82417       var optarray = field.options;
82418       var snake_case = (field.snake_case || (field.snake_case === undefined));
82419       var caseSensitive = field.caseSensitive;
82420       var combobox = uiCombobox(context, 'combo-' + field.safeid)
82421           .caseSensitive(caseSensitive)
82422           .minItems(isMulti || isSemi ? 1 : 2);
82423       var container = select(null);
82424       var inputWrap = select(null);
82425       var input = select(null);
82426       var _comboData = [];
82427       var _multiData = [];
82428       var _entity;
82429       var _country;
82430
82431       // ensure multiCombo field.key ends with a ':'
82432       if (isMulti && /[^:]$/.test(field.key)) {
82433           field.key += ':';
82434       }
82435
82436
82437       function snake(s) {
82438           return s.replace(/\s+/g, '_');
82439       }
82440
82441       function unsnake(s) {
82442           return s.replace(/_+/g, ' ');
82443       }
82444
82445       function clean(s) {
82446           return s.split(';')
82447               .map(function(s) { return s.trim(); })
82448               .join(';');
82449       }
82450
82451
82452       // returns the tag value for a display value
82453       // (for multiCombo, dval should be the key suffix, not the entire key)
82454       function tagValue(dval) {
82455           dval = clean(dval || '');
82456
82457           if (optstrings) {
82458               var found = find$1(_comboData, function(o) {
82459                   return o.key && clean(o.value) === dval;
82460               });
82461               if (found) {
82462                   return found.key;
82463               }
82464           }
82465
82466           if (field.type === 'typeCombo' && !dval) {
82467               return 'yes';
82468           }
82469
82470           return (snake_case ? snake(dval) : dval) || undefined;
82471       }
82472
82473
82474       // returns the display value for a tag value
82475       // (for multiCombo, tval should be the key suffix, not the entire key)
82476       function displayValue(tval) {
82477           tval = tval || '';
82478
82479           if (optstrings) {
82480               var found = find$1(_comboData, function(o) { return o.key === tval && o.value; });
82481               if (found) {
82482                   return found.value;
82483               }
82484           }
82485
82486           if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
82487               return '';
82488           }
82489
82490           return snake_case ? unsnake(tval) : tval;
82491       }
82492
82493
82494       function objectDifference(a, b) {
82495           return reject(a, function(d1) {
82496               return some(b, function(d2) { return d1.value === d2.value; });
82497           });
82498       }
82499
82500
82501       function initCombo(selection, attachTo) {
82502           if (optstrings) {
82503               selection.attr('readonly', 'readonly');
82504               selection.call(combobox, attachTo);
82505               setStaticValues(setPlaceholder);
82506
82507           } else if (optarray) {
82508               selection.call(combobox, attachTo);
82509               setStaticValues(setPlaceholder);
82510
82511           } else if (taginfo) {
82512               selection.call(combobox.fetcher(setTaginfoValues), attachTo);
82513               setTaginfoValues('', setPlaceholder);
82514           }
82515       }
82516
82517
82518       function setStaticValues(callback) {
82519           if (!(optstrings || optarray)) return;
82520
82521           if (optstrings) {
82522               _comboData = Object.keys(optstrings).map(function(k) {
82523                   var v = field.t('options.' + k, { 'default': optstrings[k] });
82524                   return {
82525                       key: k,
82526                       value: v,
82527                       title: v
82528                   };
82529               });
82530
82531           } else if (optarray) {
82532               _comboData = optarray.map(function(k) {
82533                   var v = snake_case ? unsnake(k) : k;
82534                   return {
82535                       key: k,
82536                       value: v,
82537                       title: v
82538                   };
82539               });
82540           }
82541
82542           combobox.data(objectDifference(_comboData, _multiData));
82543           if (callback) callback(_comboData);
82544       }
82545
82546
82547       function setTaginfoValues(q, callback) {
82548           var fn = isMulti ? 'multikeys' : 'values';
82549           var query = (isMulti ? field.key : '') + q;
82550           var hasCountryPrefix = isNetwork && _country && _country.indexOf(q.toLowerCase()) === 0;
82551           if (hasCountryPrefix) {
82552               query = _country + ':';
82553           }
82554
82555           var params = {
82556               debounce: (q !== ''),
82557               key: field.key,
82558               query: query
82559           };
82560
82561           if (_entity) {
82562               params.geometry = context.geometry(_entity.id);
82563           }
82564
82565           taginfo[fn](params, function(err, data) {
82566               if (err) return;
82567               if (hasCountryPrefix) {
82568                   data = filter(data, function(d) {
82569                       return d.value.toLowerCase().indexOf(_country + ':') === 0;
82570                   });
82571               }
82572
82573               // hide the caret if there are no suggestions
82574               container.classed('empty-combobox', data.length === 0);
82575
82576               _comboData = map$3(data, function(d) {
82577                   var k = d.value;
82578                   if (isMulti) k = k.replace(field.key, '');
82579                   var v = snake_case ? unsnake(k) : k;
82580                   return {
82581                       key: k,
82582                       value: v,
82583                       title: isMulti ? v : d.title
82584                   };
82585               });
82586
82587               _comboData = objectDifference(_comboData, _multiData);
82588               if (callback) callback(_comboData);
82589           });
82590       }
82591
82592
82593       function setPlaceholder(d) {
82594           var ph;
82595
82596           if (isMulti || isSemi) {
82597               ph = field.placeholder() || t('inspector.add');
82598           } else {
82599               var vals = map$3(d, 'value').filter(function(s) { return s.length < 20; }),
82600                   placeholders = vals.length > 1 ? vals : map$3(d, 'key');
82601               ph = field.placeholder() || placeholders.slice(0, 3).join(', ');
82602           }
82603
82604           if (!/(…|\.\.\.)$/.test(ph)) {
82605               ph += '…';
82606           }
82607
82608           container.selectAll('input')
82609               .attr('placeholder', ph);
82610       }
82611
82612
82613       function change() {
82614           var val = tagValue(utilGetSetValue(input));
82615           var t = {};
82616
82617           if (isMulti || isSemi) {
82618               if (!val) return;
82619               container.classed('active', false);
82620               utilGetSetValue(input, '');
82621
82622               if (isMulti) {
82623                   var key = field.key + val;
82624                   if (_entity) {
82625                       // don't set a multicombo value to 'yes' if it already has a non-'no' value
82626                       // e.g. `language:de=main`
82627                       var old = _entity.tags[key] || '';
82628                       if (old && old.toLowerCase() !== 'no') return;
82629                   }
82630                   field.keys.push(key);
82631                   t[key] = 'yes';
82632
82633               } else if (isSemi) {
82634                   var arr = _multiData.map(function(d) { return d.key; });
82635                   arr.push(val);
82636                   t[field.key] = compact(uniq(arr)).join(';');
82637               }
82638
82639               window.setTimeout(function() { input.node().focus(); }, 10);
82640
82641           } else {
82642               t[field.key] = val;
82643           }
82644
82645           dispatch$1.call('change', this, t);
82646       }
82647
82648
82649       function removeMultikey(d) {
82650           event.stopPropagation();
82651           var t = {};
82652           if (isMulti) {
82653               t[d.key] = undefined;
82654           } else if (isSemi) {
82655               remove$8(_multiData, function(md) { return md.key === d.key; });
82656               var arr = _multiData.map(function(md) { return md.key; });
82657               arr = compact(uniq(arr));
82658               t[field.key] = arr.length ? arr.join(';') : undefined;
82659           }
82660           dispatch$1.call('change', this, t);
82661       }
82662
82663
82664       function combo(selection) {
82665           container = selection.selectAll('.form-field-input-wrap')
82666               .data([0]);
82667
82668           var type = (isMulti || isSemi) ? 'multicombo': 'combo';
82669           container = container.enter()
82670               .append('div')
82671               .attr('class', 'form-field-input-wrap form-field-input-' + type)
82672               .merge(container);
82673
82674           if (isMulti || isSemi) {
82675               container = container.selectAll('.chiplist')
82676                   .data([0]);
82677
82678               var listClass = 'chiplist';
82679
82680               // Use a separate line for each value in the Destinations field
82681               // to mimic highway exit signs
82682               if (field.id === 'destination_oneway') {
82683                   listClass += ' full-line-chips';
82684               }
82685
82686               container = container.enter()
82687                   .append('ul')
82688                   .attr('class', listClass)
82689                   .on('click', function() {
82690                       window.setTimeout(function() { input.node().focus(); }, 10);
82691                   })
82692                   .merge(container);
82693
82694
82695               inputWrap = container.selectAll('.input-wrap')
82696                   .data([0]);
82697
82698               inputWrap = inputWrap.enter()
82699                   .append('li')
82700                   .attr('class', 'input-wrap')
82701                   .merge(inputWrap);
82702
82703               input = inputWrap.selectAll('input')
82704                   .data([0]);
82705           } else {
82706               input = container.selectAll('input')
82707                   .data([0]);
82708           }
82709
82710           input = input.enter()
82711               .append('input')
82712               .attr('type', 'text')
82713               .attr('id', 'preset-input-' + field.safeid)
82714               .call(utilNoAuto)
82715               .call(initCombo, selection)
82716               .merge(input);
82717
82718           if (isNetwork && nominatim && _entity) {
82719               var center = _entity.extent(context.graph()).center();
82720               nominatim.countryCode(center, function (err, code) {
82721                   _country = code;
82722               });
82723           }
82724
82725           input
82726               .on('change', change)
82727               .on('blur', change);
82728
82729           input
82730               .on('keydown.field', function() {
82731                   switch (event.keyCode) {
82732                       case 13: // ↩ Return
82733                           input.node().blur(); // blurring also enters the value
82734                           event.stopPropagation();
82735                           break;
82736                   }
82737               });
82738
82739           if (isMulti || isSemi) {
82740               combobox
82741                   .on('accept', function() {
82742                       input.node().blur();
82743                       input.node().focus();
82744                   });
82745
82746               input
82747                   .on('focus', function() { container.classed('active', true); });
82748           }
82749       }
82750
82751
82752       combo.tags = function(tags) {
82753           if (isMulti || isSemi) {
82754               _multiData = [];
82755
82756               if (isMulti) {
82757                   // Build _multiData array containing keys already set..
82758                   for (var k in tags) {
82759                       if (k.indexOf(field.key) !== 0) continue;
82760                       var v = (tags[k] || '').toLowerCase();
82761                       if (v === '' || v === 'no') continue;
82762
82763                       var suffix = k.substring(field.key.length);
82764                       _multiData.push({
82765                           key: k,
82766                           value: displayValue(suffix)
82767                       });
82768                   }
82769
82770                   // Set keys for form-field modified (needed for undo and reset buttons)..
82771                   field.keys = map$3(_multiData, 'key');
82772
82773               } else if (isSemi) {
82774                   var arr = compact(uniq((tags[field.key] || '').split(';')));
82775                   _multiData = arr.map(function(k) {
82776                       return {
82777                           key: k,
82778                           value: displayValue(k)
82779                       };
82780                   });
82781               }
82782
82783               // Exclude existing multikeys from combo options..
82784               var available = objectDifference(_comboData, _multiData);
82785               combobox.data(available);
82786
82787               // Hide 'Add' button if this field uses fixed set of
82788               // translateable optstrings and they're all currently used..
82789               container.selectAll('.combobox-input, .combobox-caret')
82790                   .classed('hide', optstrings && !available.length);
82791
82792
82793               // Render chips
82794               var chips = container.selectAll('.chips')
82795                   .data(_multiData);
82796
82797               chips.exit()
82798                   .remove();
82799
82800               var enter = chips.enter()
82801                   .insert('li', '.input-wrap')
82802                   .attr('class', 'chips');
82803
82804               enter.append('span');
82805               enter.append('a');
82806
82807               chips = chips.merge(enter);
82808
82809               chips.select('span')
82810                   .text(function(d) { return d.value; });
82811
82812               chips.select('a')
82813                   .on('click', removeMultikey)
82814                   .attr('class', 'remove')
82815                   .text('×');
82816
82817           } else {
82818               utilGetSetValue(input, displayValue(tags[field.key]));
82819           }
82820       };
82821
82822
82823       combo.focus = function() {
82824           input.node().focus();
82825       };
82826
82827
82828       combo.entity = function(val) {
82829           if (!arguments.length) return _entity;
82830           _entity = val;
82831           return combo;
82832       };
82833
82834
82835       return utilRebind(combo, dispatch$1, 'on');
82836   }
82837
82838   function uiFieldText(field, context) {
82839       var dispatch$1 = dispatch('change');
82840       var nominatim = services.geocoder;
82841       var input = select(null);
82842       var _entity;
82843       var _brandTip;
82844
82845       if (field.id === 'brand') {
82846           _brandTip = tooltip()
82847               .title(t('inspector.lock.suggestion', { label: field.label }))
82848               .placement('bottom');
82849       }
82850
82851
82852       function i(selection) {
82853           var preset = _entity && context.presets().match(_entity, context.graph());
82854           var isSuggestion = preset && preset.suggestion && field.id === 'brand';
82855
82856           var wrap = selection.selectAll('.form-field-input-wrap')
82857               .data([0]);
82858
82859           wrap = wrap.enter()
82860               .append('div')
82861               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
82862               .merge(wrap);
82863
82864           var fieldID = 'preset-input-' + field.safeid;
82865
82866           input = wrap.selectAll('input')
82867               .data([0]);
82868
82869           input = input.enter()
82870               .append('input')
82871               .attr('type', field.type)
82872               .attr('id', fieldID)
82873               .attr('placeholder', field.placeholder() || t('inspector.unknown'))
82874               .classed(field.type, true)
82875               .call(utilNoAuto)
82876               .merge(input);
82877
82878           input
82879               .classed('disabled', !!isSuggestion)
82880               .attr('readonly', isSuggestion || null)
82881               .on('input', change(true))
82882               .on('blur', change())
82883               .on('change', change());
82884
82885
82886           if (field.type === 'tel' && nominatim && _entity) {
82887               var center = _entity.extent(context.graph()).center();
82888               nominatim.countryCode(center, function (err, countryCode) {
82889                   if (err || !dataPhoneFormats[countryCode]) return;
82890                   wrap.selectAll('#' + fieldID)
82891                       .attr('placeholder', dataPhoneFormats[countryCode]);
82892               });
82893
82894           } else if (field.type === 'number') {
82895               var rtl = (textDirection === 'rtl');
82896
82897               input.attr('type', 'text');
82898
82899               var buttons = wrap.selectAll('.increment, .decrement')
82900                   .data(rtl ? [1, -1] : [-1, 1]);
82901
82902               buttons.enter()
82903                   .append('button')
82904                   .attr('tabindex', -1)
82905                   .attr('class', function(d) {
82906                       var which = (d === 1 ? 'increment' : 'decrement');
82907                       return 'form-field-button ' + which;
82908                   })
82909                   .merge(buttons)
82910                   .on('click', function(d) {
82911                       event.preventDefault();
82912                       var raw_vals = input.node().value || '0';
82913                       var vals = raw_vals.split(';');
82914                       vals = vals.map(function(v) {
82915                           var num = parseFloat(v.trim(), 10);
82916                           return isFinite(num) ? clamped(num + d) : v.trim();
82917                       });
82918                       input.node().value = vals.join(';');
82919                       change()();
82920                   });
82921
82922           } else if (preset && field.id === 'brand') {
82923               var pTag = preset.id.split('/', 2);
82924               var pKey = pTag[0];
82925               if (isSuggestion) {
82926                   // A "suggestion" preset (brand name)
82927                   // Put suggestion keys in `field.keys` so delete button can remove them all.
82928                   field.keys = Object.keys(preset.removeTags)
82929                       .filter(function(k) { return k !== pKey && k !== 'name'; });
82930               }
82931
82932               wrap.call(isSuggestion ? _brandTip : _brandTip.destroy);
82933           }
82934       }
82935
82936
82937       // clamp number to min/max
82938       function clamped(num) {
82939           if (field.minValue !== undefined) {
82940               num = Math.max(num, field.minValue);
82941           }
82942           if (field.maxValue !== undefined) {
82943               num = Math.min(num, field.maxValue);
82944           }
82945           return num;
82946       }
82947
82948
82949       function change(onInput) {
82950           return function() {
82951               var t = {};
82952               var val = utilGetSetValue(input).trim() || undefined;
82953
82954               if (!onInput) {
82955                   if (field.type === 'number' && val !== undefined) {
82956                       var vals = val.split(';');
82957                       vals = vals.map(function(v) {
82958                           var num = parseFloat(v.trim(), 10);
82959                           return isFinite(num) ? clamped(num) : v.trim();
82960                       });
82961                       val = vals.join(';');
82962                   }
82963                   utilGetSetValue(input, val || '');
82964               }
82965               t[field.key] = val;
82966               dispatch$1.call('change', this, t, onInput);
82967           };
82968       }
82969
82970
82971       i.entity = function(val) {
82972           if (!arguments.length) return _entity;
82973           _entity = val;
82974           return i;
82975       };
82976
82977
82978       i.tags = function(tags) {
82979           utilGetSetValue(input, tags[field.key] || '');
82980       };
82981
82982
82983       i.focus = function() {
82984           var node = input.node();
82985           if (node) node.focus();
82986       };
82987
82988       return utilRebind(i, dispatch$1, 'on');
82989   }
82990
82991   function uiFieldAccess(field, context) {
82992       var dispatch$1 = dispatch('change');
82993       var items = select(null);
82994
82995       function access(selection) {
82996           var wrap = selection.selectAll('.form-field-input-wrap')
82997               .data([0]);
82998
82999           wrap = wrap.enter()
83000               .append('div')
83001               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
83002               .merge(wrap);
83003
83004           var list = wrap.selectAll('ul')
83005               .data([0]);
83006
83007           list = list.enter()
83008               .append('ul')
83009               .attr('class', 'labeled-inputs')
83010               .merge(list);
83011
83012
83013           items = list.selectAll('li')
83014               .data(field.keys);
83015
83016           // Enter
83017           var enter = items.enter()
83018               .append('li')
83019               .attr('class', function(d) { return 'preset-access-' + d; });
83020
83021           enter
83022               .append('span')
83023               .attr('class', 'label preset-label-access')
83024               .attr('for', function(d) { return 'preset-input-access-' + d; })
83025               .text(function(d) { return field.t('types.' + d); });
83026
83027           enter
83028               .append('div')
83029               .attr('class', 'preset-input-access-wrap')
83030               .append('input')
83031               .attr('type', 'text')
83032               .attr('class', 'preset-input-access')
83033               .attr('id', function(d) { return 'preset-input-access-' + d; })
83034               .call(utilNoAuto)
83035               .each(function(d) {
83036                   select(this)
83037                       .call(uiCombobox(context, 'access-' + d)
83038                           .data(access.options(d))
83039                       );
83040               });
83041
83042
83043           // Update
83044           items = items.merge(enter);
83045
83046           wrap.selectAll('.preset-input-access')
83047               .on('change', change)
83048               .on('blur', change);
83049       }
83050
83051
83052       function change(d) {
83053           var tag = {};
83054           tag[d] = utilGetSetValue(select(this)) || undefined;
83055           dispatch$1.call('change', this, tag);
83056       }
83057
83058
83059       access.options = function(type) {
83060           var options = ['no', 'permissive', 'private', 'permit', 'destination'];
83061
83062           if (type !== 'access') {
83063               options.unshift('yes');
83064               options.push('designated');
83065
83066               if (type === 'bicycle') {
83067                   options.push('dismount');
83068               }
83069           }
83070
83071           return options.map(function(option) {
83072               return {
83073                   title: field.t('options.' + option + '.description'),
83074                   value: option
83075               };
83076           });
83077       };
83078
83079
83080       var placeholders = {
83081           footway: {
83082               foot: 'designated',
83083               motor_vehicle: 'no'
83084           },
83085           steps: {
83086               foot: 'yes',
83087               motor_vehicle: 'no',
83088               bicycle: 'no',
83089               horse: 'no'
83090           },
83091           pedestrian: {
83092               foot: 'yes',
83093               motor_vehicle: 'no'
83094           },
83095           cycleway: {
83096               motor_vehicle: 'no',
83097               bicycle: 'designated'
83098           },
83099           bridleway: {
83100               motor_vehicle: 'no',
83101               horse: 'designated'
83102           },
83103           path: {
83104               foot: 'yes',
83105               motor_vehicle: 'no',
83106               bicycle: 'yes',
83107               horse: 'yes'
83108           },
83109           motorway: {
83110               foot: 'no',
83111               motor_vehicle: 'yes',
83112               bicycle: 'no',
83113               horse: 'no'
83114           },
83115           trunk: {
83116               motor_vehicle: 'yes'
83117           },
83118           primary: {
83119               foot: 'yes',
83120               motor_vehicle: 'yes',
83121               bicycle: 'yes',
83122               horse: 'yes'
83123           },
83124           secondary: {
83125               foot: 'yes',
83126               motor_vehicle: 'yes',
83127               bicycle: 'yes',
83128               horse: 'yes'
83129           },
83130           tertiary: {
83131               foot: 'yes',
83132               motor_vehicle: 'yes',
83133               bicycle: 'yes',
83134               horse: 'yes'
83135           },
83136           residential: {
83137               foot: 'yes',
83138               motor_vehicle: 'yes',
83139               bicycle: 'yes',
83140               horse: 'yes'
83141           },
83142           unclassified: {
83143               foot: 'yes',
83144               motor_vehicle: 'yes',
83145               bicycle: 'yes',
83146               horse: 'yes'
83147           },
83148           service: {
83149               foot: 'yes',
83150               motor_vehicle: 'yes',
83151               bicycle: 'yes',
83152               horse: 'yes'
83153           },
83154           motorway_link: {
83155               foot: 'no',
83156               motor_vehicle: 'yes',
83157               bicycle: 'no',
83158               horse: 'no'
83159           },
83160           trunk_link: {
83161               motor_vehicle: 'yes'
83162           },
83163           primary_link: {
83164               foot: 'yes',
83165               motor_vehicle: 'yes',
83166               bicycle: 'yes',
83167               horse: 'yes'
83168           },
83169           secondary_link: {
83170               foot: 'yes',
83171               motor_vehicle: 'yes',
83172               bicycle: 'yes',
83173               horse: 'yes'
83174           },
83175           tertiary_link: {
83176               foot: 'yes',
83177               motor_vehicle: 'yes',
83178               bicycle: 'yes',
83179               horse: 'yes'
83180           }
83181       };
83182
83183
83184       access.tags = function(tags) {
83185           utilGetSetValue(items.selectAll('.preset-input-access'),
83186               function(d) { return tags[d] || ''; })
83187               .attr('placeholder', function() {
83188                   return tags.access ? tags.access : field.placeholder();
83189               });
83190
83191           items.selectAll('#preset-input-access-access')
83192               .attr('placeholder', 'yes');
83193
83194           var which = tags.highway;
83195           if (!placeholders[which]) return;
83196
83197           var keys = Object.keys(placeholders[which]);
83198           keys.forEach(function(k) {
83199               var v = placeholders[which][k];
83200               items.selectAll('#preset-input-access-' + k)
83201                   .attr('placeholder', tags.access || v);
83202           });
83203       };
83204
83205
83206       access.focus = function() {
83207           items.selectAll('.preset-input-access')
83208               .node().focus();
83209       };
83210
83211
83212       return utilRebind(access, dispatch$1, 'on');
83213   }
83214
83215   function uiFieldAddress(field, context) {
83216       var dispatch$1 = dispatch('init', 'change');
83217       var nominatim = services.geocoder;
83218       var wrap = select(null);
83219       var _isInitialized = false;
83220       var _entity;
83221
83222       function getNearStreets() {
83223           var extent = _entity.extent(context.graph());
83224           var l = extent.center();
83225           var box = geoExtent(l).padByMeters(200);
83226
83227           var streets = context.intersects(box)
83228               .filter(isAddressable)
83229               .map(function(d) {
83230                   var loc = context.projection([
83231                       (extent[0][0] + extent[1][0]) / 2,
83232                       (extent[0][1] + extent[1][1]) / 2
83233                   ]);
83234                   var choice = geoChooseEdge(context.childNodes(d), loc, context.projection);
83235
83236                   return {
83237                       title: d.tags.name,
83238                       value: d.tags.name,
83239                       dist: choice.distance
83240                   };
83241               })
83242               .sort(function(a, b) {
83243                   return a.dist - b.dist;
83244               });
83245
83246           return uniqBy(streets, 'value');
83247
83248           function isAddressable(d) {
83249               return d.tags.highway && d.tags.name && d.type === 'way';
83250           }
83251       }
83252
83253
83254       function getNearCities() {
83255           var extent = _entity.extent(context.graph());
83256           var l = extent.center();
83257           var box = geoExtent(l).padByMeters(200);
83258
83259           var cities = context.intersects(box)
83260               .filter(isAddressable)
83261               .map(function(d) {
83262                   return {
83263                       title: d.tags['addr:city'] || d.tags.name,
83264                       value: d.tags['addr:city'] || d.tags.name,
83265                       dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
83266                   };
83267               })
83268               .sort(function(a, b) {
83269                   return a.dist - b.dist;
83270               });
83271
83272           return uniqBy(cities, 'value');
83273
83274
83275           function isAddressable(d) {
83276               if (d.tags.name) {
83277                   if (d.tags.admin_level === '8' && d.tags.boundary === 'administrative')
83278                       return true;
83279                   if (d.tags.border_type === 'city')
83280                       return true;
83281                   if (d.tags.place === 'city' || d.tags.place === 'town' || d.tags.place === 'village')
83282                       return true;
83283               }
83284
83285               if (d.tags['addr:city'])
83286                   return true;
83287
83288               return false;
83289           }
83290       }
83291
83292       function getNearValues(key) {
83293           var extent = _entity.extent(context.graph());
83294           var l = extent.center();
83295           var box = geoExtent(l).padByMeters(200);
83296
83297           var results = context.intersects(box)
83298               .filter(function hasTag(d) { return d.id !== _entity.id && d.tags[key]; })
83299               .map(function(d) {
83300                   return {
83301                       title: d.tags[key],
83302                       value: d.tags[key],
83303                       dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
83304                   };
83305               })
83306               .sort(function(a, b) {
83307                   return a.dist - b.dist;
83308               });
83309
83310           return uniqBy(results, 'value');
83311       }
83312
83313
83314       function countryCallback(err, countryCode) {
83315           if (err) return;
83316
83317           var addressFormat = find$1(dataAddressFormats, function (a) {
83318               return a && a.countryCodes && includes(a.countryCodes, countryCode.toLowerCase());
83319           }) || dataAddressFormats[0];
83320
83321           var dropdowns = addressFormat.dropdowns || [
83322               'city', 'county', 'country', 'district', 'hamlet',
83323               'neighbourhood', 'place', 'postcode', 'province',
83324               'quarter', 'state', 'street', 'subdistrict', 'suburb'
83325           ];
83326
83327           var widths = addressFormat.widths || {
83328               housenumber: 1/3, street: 2/3,
83329               city: 2/3, state: 1/4, postcode: 1/3
83330           };
83331
83332           function row(r) {
83333               // Normalize widths.
83334               var total = reduce(r, function(sum, key) {
83335                   return sum + (widths[key] || 0.5);
83336               }, 0);
83337
83338               return r.map(function(key) {
83339                   return {
83340                       id: key,
83341                       width: (widths[key] || 0.5) / total
83342                   };
83343               });
83344           }
83345
83346           wrap.selectAll('.addr-row')
83347               .data(addressFormat.format)
83348               .enter()
83349               .append('div')
83350               .attr('class', 'addr-row')
83351               .selectAll('input')
83352               .data(row)
83353               .enter()
83354               .append('input')
83355               .property('type', 'text')
83356               .attr('placeholder', function (d) {
83357                   var localkey = d.id + '!' + countryCode.toLowerCase();
83358                   var tkey = field.strings.placeholders[localkey] ? localkey : d.id;
83359                   return field.t('placeholders.' + tkey);
83360               })
83361               .attr('class', function (d) { return 'addr-' + d.id; })
83362               .call(utilNoAuto)
83363               .each(addDropdown)
83364               .style('width', function (d) { return d.width * 100 + '%'; });
83365
83366
83367           function addDropdown(d) {
83368               if (dropdowns.indexOf(d.id) === -1) return;  // not a dropdown
83369
83370               var nearValues = (d.id === 'street') ? getNearStreets
83371                   : (d.id === 'city') ? getNearCities
83372                   : getNearValues;
83373
83374               select(this)
83375                   .call(uiCombobox(context, 'address-' + d.id)
83376                       .minItems(1)
83377                       .caseSensitive(true)
83378                       .fetcher(function(value, callback) {
83379                           callback(nearValues('addr:' + d.id));
83380                       })
83381                   );
83382           }
83383
83384           wrap.selectAll('input')
83385               .on('blur', change())
83386               .on('change', change());
83387
83388           wrap.selectAll('input:not(.combobox-input)')
83389               .on('input', change(true));
83390
83391           dispatch$1.call('init');
83392           _isInitialized = true;
83393       }
83394
83395
83396       function address(selection) {
83397           _isInitialized = false;
83398
83399           wrap = selection.selectAll('.form-field-input-wrap')
83400               .data([0]);
83401
83402           wrap = wrap.enter()
83403               .append('div')
83404               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
83405               .merge(wrap);
83406
83407           if (nominatim && _entity) {
83408               var center = _entity.extent(context.graph()).center();
83409               nominatim.countryCode(center, countryCallback);
83410           }
83411       }
83412
83413
83414       function change(onInput) {
83415           return function() {
83416               var tags = {};
83417
83418               wrap.selectAll('input')
83419                   .each(function (field) {
83420                       tags['addr:' + field.id] = this.value || undefined;
83421                   });
83422
83423               dispatch$1.call('change', this, tags, onInput);
83424           };
83425       }
83426
83427
83428       function updateTags(tags) {
83429           utilGetSetValue(wrap.selectAll('input'), function (field) {
83430               return tags['addr:' + field.id] || '';
83431           });
83432       }
83433
83434
83435       address.entity = function(val) {
83436           if (!arguments.length) return _entity;
83437           _entity = val;
83438           return address;
83439       };
83440
83441
83442       address.tags = function(tags) {
83443           if (_isInitialized) {
83444               updateTags(tags);
83445           } else {
83446               dispatch$1.on('init', function () {
83447                   dispatch$1.on('init', null);
83448                   updateTags(tags);
83449               });
83450           }
83451       };
83452
83453
83454       address.focus = function() {
83455           var node = wrap.selectAll('input').node();
83456           if (node) node.focus();
83457       };
83458
83459
83460       return utilRebind(address, dispatch$1, 'on');
83461   }
83462
83463   function uiFieldCycleway(field, context) {
83464       var dispatch$1 = dispatch('change');
83465       var items = select(null);
83466       var wrap = select(null);
83467
83468       function cycleway(selection) {
83469
83470           function stripcolon(s) {
83471               return s.replace(':', '');
83472           }
83473
83474
83475           wrap = selection.selectAll('.form-field-input-wrap')
83476               .data([0]);
83477
83478           wrap = wrap.enter()
83479               .append('div')
83480               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
83481               .merge(wrap);
83482
83483
83484           var div = wrap.selectAll('ul')
83485               .data([0]);
83486
83487           div = div.enter()
83488               .append('ul')
83489               .attr('class', 'labeled-inputs')
83490               .merge(div);
83491
83492           var keys = ['cycleway:left', 'cycleway:right'];
83493
83494           items = div.selectAll('li')
83495               .data(keys);
83496
83497           var enter = items.enter()
83498               .append('li')
83499               .attr('class', function(d) { return 'preset-cycleway-' + stripcolon(d); });
83500
83501           enter
83502               .append('span')
83503               .attr('class', 'label preset-label-cycleway')
83504               .attr('for', function(d) { return 'preset-input-cycleway-' + stripcolon(d); })
83505               .text(function(d) { return field.t('types.' + d); });
83506
83507           enter
83508               .append('div')
83509               .attr('class', 'preset-input-cycleway-wrap')
83510               .append('input')
83511               .attr('type', 'text')
83512               .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
83513               .call(utilNoAuto)
83514               .each(function(d) {
83515                   select(this)
83516                       .call(uiCombobox(context, 'cycleway-' + stripcolon(d))
83517                           .data(cycleway.options(d))
83518                       );
83519               });
83520
83521
83522           // Update
83523           wrap.selectAll('.preset-input-cycleway')
83524               .on('change', change)
83525               .on('blur', change);
83526       }
83527
83528
83529       function change() {
83530           var left = utilGetSetValue(select('.preset-input-cyclewayleft'));
83531           var right = utilGetSetValue(select('.preset-input-cyclewayright'));
83532           var tag = {};
83533
83534           if (left === 'none' || left === '') { left = undefined; }
83535           if (right === 'none' || right === '') { right = undefined; }
83536
83537           // Always set both left and right as changing one can affect the other
83538           tag = {
83539               cycleway: undefined,
83540               'cycleway:left': left,
83541               'cycleway:right': right
83542           };
83543
83544           // If the left and right tags match, use the cycleway tag to tag both
83545           // sides the same way
83546           if (left === right) {
83547               tag = {
83548                   cycleway: left,
83549                   'cycleway:left': undefined,
83550                   'cycleway:right': undefined
83551               };
83552           }
83553
83554           dispatch$1.call('change', this, tag);
83555       }
83556
83557
83558       cycleway.options = function() {
83559           return Object.keys(field.strings.options).map(function(option) {
83560               return {
83561                   title: field.t('options.' + option + '.description'),
83562                   value: option
83563               };
83564           });
83565       };
83566
83567
83568       cycleway.tags = function(tags) {
83569           utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
83570                   // If cycleway is set, always return that
83571                   if (tags.cycleway) {
83572                       return tags.cycleway;
83573                   }
83574                   return tags[d] || '';
83575               })
83576               .attr('placeholder', field.placeholder());
83577       };
83578
83579
83580       cycleway.focus = function() {
83581           var node = wrap.selectAll('input').node();
83582           if (node) node.focus();
83583       };
83584
83585
83586       return utilRebind(cycleway, dispatch$1, 'on');
83587   }
83588
83589   function uiFieldLanes(field, context) {
83590       var dispatch$1 = dispatch('change');
83591       var LANE_WIDTH = 40;
83592       var LANE_HEIGHT = 200;
83593       var _entityID;
83594
83595       function lanes(selection) {
83596           var lanesData = context.entity(_entityID).lanes();
83597
83598           if (!select('.inspector-wrap.inspector-hidden').empty() || !selection.node().parentNode) {
83599               selection.call(lanes.off);
83600               return;
83601           }
83602
83603           var wrap = selection.selectAll('.form-field-input-wrap')
83604               .data([0]);
83605
83606           wrap = wrap.enter()
83607               .append('div')
83608               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
83609               .merge(wrap);
83610
83611           var surface =  wrap.selectAll('.surface')
83612               .data([0]);
83613
83614           var d = utilGetDimensions(wrap);
83615           var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
83616
83617           surface = surface.enter()
83618               .append('svg')
83619               .attr('width', d[0])
83620               .attr('height', 300)
83621               .attr('class', 'surface')
83622               .merge(surface);
83623
83624
83625           var lanesSelection = surface.selectAll('.lanes')
83626               .data([0]);
83627
83628           lanesSelection = lanesSelection.enter()
83629               .append('g')
83630               .attr('class', 'lanes')
83631               .merge(lanesSelection);
83632
83633           lanesSelection
83634               .attr('transform', function () {
83635                   return 'translate(' + (freeSpace / 2) + ', 0)';
83636               });
83637
83638
83639           var lane = lanesSelection.selectAll('.lane')
83640              .data(lanesData.lanes);
83641
83642           lane.exit()
83643               .remove();
83644
83645           var enter = lane.enter()
83646               .append('g')
83647               .attr('class', 'lane');
83648
83649           enter
83650               .append('g')
83651               .append('rect')
83652               .attr('y', 50)
83653               .attr('width', LANE_WIDTH)
83654               .attr('height', LANE_HEIGHT);
83655
83656           enter
83657               .append('g')
83658               .attr('class', 'forward')
83659               .append('text')
83660               .attr('y', 40)
83661               .attr('x', 14)
83662               .text('▲');
83663
83664           enter
83665               .append('g')
83666               .attr('class', 'bothways')
83667               .append('text')
83668               .attr('y', 40)
83669               .attr('x', 14)
83670               .text('▲▼');
83671
83672           enter
83673               .append('g')
83674               .attr('class', 'backward')
83675               .append('text')
83676               .attr('y', 40)
83677               .attr('x', 14)
83678               .text('▼');
83679
83680
83681           lane = lane
83682               .merge(enter);
83683
83684           lane
83685               .attr('transform', function(d) {
83686                   return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
83687               });
83688
83689           lane.select('.forward')
83690               .style('visibility', function(d) {
83691                   return d.direction === 'forward' ? 'visible' : 'hidden';
83692               });
83693
83694           lane.select('.bothways')
83695               .style('visibility', function(d) {
83696                   return d.direction === 'bothways' ? 'visible' : 'hidden';
83697               });
83698
83699           lane.select('.backward')
83700               .style('visibility', function(d) {
83701                   return d.direction === 'backward' ? 'visible' : 'hidden';
83702               });
83703       }
83704
83705
83706       lanes.entity = function(val) {
83707           if (!_entityID || _entityID !== val.id) {
83708               _entityID = val.id;
83709           }
83710       };
83711
83712       lanes.tags = function() {};
83713       lanes.focus = function() {};
83714       lanes.off = function() {};
83715
83716       return utilRebind(lanes, dispatch$1, 'on');
83717   }
83718
83719   function uiFieldLocalized(field, context) {
83720       var dispatch$1 = dispatch('change', 'input');
83721       var wikipedia = services.wikipedia;
83722       var input = select(null);
83723       var localizedInputs = select(null);
83724
83725       var allSuggestions = context.presets().collection.filter(function(p) {
83726           return p.suggestion === true;
83727       });
83728
83729       // reuse these combos
83730       var langCombo = uiCombobox(context, 'localized-lang')
83731           .fetcher(fetchLanguages)
83732           .minItems(0);
83733
83734       var brandCombo = uiCombobox(context, 'localized-brand')
83735           .canAutocomplete(false)
83736           .minItems(1);
83737
83738       var _selection = select(null);
83739       var _multilingual = [];
83740       var _isLocked = false;
83741       var _brandTip = tooltip()
83742           .title(t('inspector.lock.suggestion', { label: field.label }))
83743           .placement('bottom');
83744       var _buttonTip = tooltip()
83745           .title(t('translate.translate'))
83746           .placement('left');
83747       var _wikiTitles;
83748       var _entity;
83749
83750
83751       function calcLocked() {
83752           if (!_entity) {    // the original entity
83753               _isLocked = false;
83754               return;
83755           }
83756
83757           var latest = context.hasEntity(_entity.id);
83758           if (!latest) {    // get current entity, possibly edited
83759               _isLocked = false;
83760               return;
83761           }
83762
83763           var hasOriginalName = (latest.tags.name && latest.tags.name === _entity.tags.name);
83764           var hasWikidata = latest.tags.wikidata;
83765           var preset = context.presets().match(latest, context.graph());
83766           var isSuggestion = preset && preset.suggestion;
83767           var showsBrand = preset && preset.fields
83768               .filter(function(d) { return d.id === 'brand'; }).length;
83769
83770           _isLocked = !!(field.id === 'name' && hasOriginalName &&
83771               (hasWikidata || (isSuggestion && !showsBrand)));
83772       }
83773
83774
83775       function calcMultilingual(tags) {
83776           _multilingual = [];
83777           for (var k in tags) {
83778               var m = k.match(/^(.*):([a-zA-Z_-]+)$/);
83779               if (m && m[1] === field.key && m[2]) {
83780                   _multilingual.push({ lang: m[2], value: tags[k] });
83781               }
83782           }
83783           _multilingual.reverse();
83784       }
83785
83786
83787       function localized(selection) {
83788           _selection = selection;
83789           calcLocked();
83790           var entity = _entity && context.hasEntity(_entity.id);  // get latest
83791           var preset = entity && context.presets().match(entity, context.graph());
83792
83793           var wrap = selection.selectAll('.form-field-input-wrap')
83794               .data([0]);
83795
83796           // enter/update
83797           wrap = wrap.enter()
83798               .append('div')
83799               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
83800               .merge(wrap)
83801               .call(_isLocked ? _brandTip : _brandTip.destroy);
83802
83803
83804           input = wrap.selectAll('.localized-main')
83805               .data([0]);
83806
83807           // enter/update
83808           input = input.enter()
83809               .append('input')
83810               .attr('type', 'text')
83811               .attr('id', 'preset-input-' + field.safeid)
83812               .attr('class', 'localized-main')
83813               .attr('placeholder', field.placeholder())
83814               .call(utilNoAuto)
83815               .merge(input);
83816
83817           if (preset && field.id === 'name') {
83818               var pTag = preset.id.split('/', 2);
83819               var pKey = pTag[0];
83820               var pValue = pTag[1];
83821
83822               if (preset.suggestion) {
83823                   // A "suggestion" preset (brand name)
83824                   // Put suggestion keys in `field.keys` so delete button can remove them all.
83825                   field.keys = Object.keys(preset.removeTags)
83826                       .filter(function(k) { return k !== pKey; });
83827
83828               } else {
83829                   // Not a suggestion preset - Add a suggestions dropdown if it makes sense to.
83830                   // This code attempts to determine if the matched preset is the
83831                   // kind of preset that even can benefit from name suggestions..
83832                   // - true = shops, cafes, hotels, etc. (also generic and fallback presets)
83833                   // - false = churches, parks, hospitals, etc. (things not in the index)
83834                   var isFallback = preset.isFallback();
83835                   var goodSuggestions = allSuggestions.filter(function(s) {
83836                       if (isFallback) return true;
83837                       var sTag = s.id.split('/', 2);
83838                       var sKey = sTag[0];
83839                       var sValue = sTag[1];
83840                       return pKey === sKey && (!pValue || pValue === sValue);
83841                   });
83842
83843                   // Show the suggestions.. If the user picks one, change the tags..
83844                   if (allSuggestions.length && goodSuggestions.length) {
83845                       input
83846                           .on('blur.localized', checkBrandOnBlur)
83847                           .call(brandCombo
83848                               .fetcher(fetchBrandNames(preset, allSuggestions))
83849                               .on('accept', acceptBrand)
83850                               .on('cancel', cancelBrand)
83851                           );
83852                   }
83853               }
83854           }
83855
83856           input
83857               .classed('disabled', !!_isLocked)
83858               .attr('readonly', _isLocked || null)
83859               .on('input', change(true))
83860               .on('blur', change())
83861               .on('change', change());
83862
83863
83864           var translateButton = wrap.selectAll('.localized-add')
83865               .data([0]);
83866
83867           translateButton = translateButton.enter()
83868               .append('button')
83869               .attr('class', 'localized-add form-field-button')
83870               .attr('tabindex', -1)
83871               .call(svgIcon('#iD-icon-plus'))
83872               .merge(translateButton);
83873
83874           translateButton
83875               .classed('disabled', !!_isLocked)
83876               .call(_isLocked ? _buttonTip.destroy : _buttonTip)
83877               .on('click', addNew);
83878
83879
83880           if (entity && !_multilingual.length) {
83881               calcMultilingual(entity.tags);
83882           }
83883
83884           localizedInputs = selection.selectAll('.localized-multilingual')
83885               .data([0]);
83886
83887           localizedInputs = localizedInputs.enter()
83888               .append('div')
83889               .attr('class', 'localized-multilingual')
83890               .merge(localizedInputs);
83891
83892           localizedInputs
83893               .call(renderMultilingual);
83894
83895           localizedInputs.selectAll('button, input')
83896               .classed('disabled', !!_isLocked)
83897               .attr('readonly', _isLocked || null);
83898
83899
83900           // We are not guaranteed to get an `accept` or `cancel` when blurring the field.
83901           // (This can happen if the user actives the combo, arrows down, and then clicks off to blur)
83902           // So compare the current field value against the suggestions one last time.
83903           function checkBrandOnBlur() {
83904               var latest = context.hasEntity(_entity.id);
83905               if (!latest) return;   // deleting the entity blurred the field?
83906
83907               var preset = context.presets().match(latest, context.graph());
83908               if (preset && preset.suggestion) return;   // already accepted
83909
83910               // note: here we are testing against "decorated" names, i.e. 'Starbucks – Cafe'
83911               var name = utilGetSetValue(input).trim();
83912               var matched = allSuggestions.filter(function(s) { return name === s.name(); });
83913
83914               if (matched.length === 1) {
83915                   acceptBrand({ suggestion: matched[0] });
83916               } else {
83917                   cancelBrand();
83918               }
83919           }
83920
83921
83922           function acceptBrand(d) {
83923               if (!d) {
83924                   cancelBrand();
83925                   return;
83926               }
83927
83928               var entity = context.entity(_entity.id);  // get latest
83929               var tags = entity.tags;
83930               var geometry = entity.geometry(context.graph());
83931               var removed = preset.unsetTags(tags, geometry);
83932               for (var k in tags) {
83933                   tags[k] = removed[k];  // set removed tags to `undefined`
83934               }
83935               tags = d.suggestion.setTags(tags, geometry);
83936               utilGetSetValue(input, tags.name);
83937               dispatch$1.call('change', this, tags);
83938           }
83939
83940
83941           // user hit escape, clean whatever preset name appears after the last ' – '
83942           function cancelBrand() {
83943               var name = utilGetSetValue(input);
83944               var clean = cleanName(name);
83945               if (clean !== name) {
83946                   utilGetSetValue(input, clean);
83947                   dispatch$1.call('change', this, { name: clean });
83948               }
83949           }
83950
83951           // Remove whatever is after the last ' – '
83952           // NOTE: split/join on en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
83953           function cleanName(name) {
83954               var parts = name.split(' – ');
83955               if (parts.length > 1) {
83956                   parts.pop();
83957                   name = parts.join(' – ');
83958               }
83959               return name;
83960           }
83961
83962
83963           function fetchBrandNames(preset, suggestions) {
83964               var pTag = preset.id.split('/', 2);
83965               var pKey = pTag[0];
83966               var pValue = pTag[1];
83967
83968               return function(value, callback) {
83969                   var results = [];
83970                   if (value && value.length > 2) {
83971                       for (var i = 0; i < suggestions.length; i++) {
83972                           var s = suggestions[i];
83973                           var sTag = s.id.split('/', 2);
83974                           var sKey = sTag[0];
83975                           var sValue = sTag[1];
83976                           var name = s.name();
83977                           var dist = utilEditDistance(value, name.substring(0, value.length));
83978                           var matchesPreset = (pKey === sKey && (!pValue || pValue === sValue));
83979
83980                           if (dist < 1 || (matchesPreset && dist < 3)) {
83981                               var obj = {
83982                                   title: name,
83983                                   value: name,
83984                                   suggestion: s,
83985                                   dist: dist + (matchesPreset ? 0 : 1)  // penalize if not matched preset
83986                               };
83987                               results.push(obj);
83988                           }
83989                       }
83990                       results.sort(function(a, b) { return a.dist - b.dist; });
83991                   }
83992                   results = results.slice(0, 10);
83993                   callback(results);
83994               };
83995           }
83996
83997
83998           function addNew() {
83999               event.preventDefault();
84000               if (_isLocked) return;
84001
84002               var defaultLang = utilDetect().locale.toLowerCase().split('-')[0];
84003               var langExists = find$1(_multilingual, function(datum) { return datum.lang === defaultLang;});
84004               var isLangEn = defaultLang.indexOf('en') > -1;
84005               if (isLangEn || langExists) {
84006                   defaultLang = '';
84007               }
84008               _multilingual.push({ lang: defaultLang, value: '' });
84009
84010               localizedInputs
84011                   .call(renderMultilingual);
84012           }
84013
84014
84015           function change(onInput) {
84016               return function() {
84017                   if (_isLocked) {
84018                       event.preventDefault();
84019                       return;
84020                   }
84021                   var t = {};
84022                   t[field.key] = utilGetSetValue(select(this)) || undefined;
84023                   dispatch$1.call('change', this, t, onInput);
84024               };
84025           }
84026       }
84027
84028
84029       function key(lang) {
84030           return field.key + ':' + lang;
84031       }
84032
84033
84034       function changeLang(d) {
84035           var lang = utilGetSetValue(select(this));
84036           var t = {};
84037           var language = find$1(wikipedia$2, function(d) {
84038               return d[0].toLowerCase() === lang.toLowerCase() ||
84039                   d[1].toLowerCase() === lang.toLowerCase();
84040           });
84041
84042           if (language) lang = language[2];
84043
84044           if (d.lang && d.lang !== lang) {
84045               t[key(d.lang)] = undefined;
84046           }
84047
84048           var value = utilGetSetValue(select(this.parentNode)
84049               .selectAll('.localized-value'));
84050
84051           if (lang && value) {
84052               t[key(lang)] = value;
84053           } else if (lang && _wikiTitles && _wikiTitles[d.lang]) {
84054               t[key(lang)] = _wikiTitles[d.lang];
84055           }
84056
84057           d.lang = lang;
84058           dispatch$1.call('change', this, t);
84059       }
84060
84061
84062       function changeValue(d) {
84063           if (!d.lang) return;
84064           var t = {};
84065           t[key(d.lang)] = utilGetSetValue(select(this)) || undefined;
84066           dispatch$1.call('change', this, t);
84067       }
84068
84069
84070       function fetchLanguages(value, cb) {
84071           var v = value.toLowerCase();
84072
84073           cb(wikipedia$2.filter(function(d) {
84074               return d[0].toLowerCase().indexOf(v) >= 0 ||
84075               d[1].toLowerCase().indexOf(v) >= 0 ||
84076               d[2].toLowerCase().indexOf(v) >= 0;
84077           }).map(function(d) {
84078               return { value: d[1] };
84079           }));
84080       }
84081
84082
84083       function renderMultilingual(selection) {
84084           var wraps = selection.selectAll('div.entry')
84085               .data(_multilingual, function(d) { return d.lang; });
84086
84087           wraps.exit()
84088               .transition()
84089               .duration(200)
84090               .style('max-height', '0px')
84091               .style('opacity', '0')
84092               .style('top', '-10px')
84093               .remove();
84094
84095           var innerWrap = wraps.enter()
84096               .insert('div', ':first-child');
84097
84098           innerWrap
84099               .attr('class', 'entry')
84100               .each(function() {
84101                   var wrap = select(this);
84102
84103                   var label = wrap
84104                       .append('label')
84105                       .attr('class', 'form-field-label');
84106
84107                   label
84108                       .append('span')
84109                       .attr('class', 'label-text')
84110                       .text(t('translate.localized_translation_label'));
84111
84112                   label
84113                       .append('button')
84114                       .attr('class', 'remove-icon-multilingual')
84115                       .on('click', function(d){
84116                           if (_isLocked) return;
84117                           event.preventDefault();
84118                           var t = {};
84119                           t[key(d.lang)] = undefined;
84120                           dispatch$1.call('change', this, t);
84121                           select(this.parentNode.parentNode.parentNode)
84122                               .style('top', '0')
84123                               .style('max-height', '240px')
84124                               .transition()
84125                               .style('opacity', '0')
84126                               .style('max-height', '0px')
84127                               .remove();
84128                       })
84129                       .call(svgIcon('#iD-operation-delete'));
84130
84131                   wrap
84132                       .append('input')
84133                       .attr('class', 'localized-lang')
84134                       .attr('type', 'text')
84135                       .attr('placeholder', t('translate.localized_translation_language'))
84136                       .on('blur', changeLang)
84137                       .on('change', changeLang)
84138                       .call(langCombo);
84139
84140                   wrap
84141                       .append('input')
84142                       .attr('type', 'text')
84143                       .attr('placeholder', t('translate.localized_translation_name'))
84144                       .attr('class', 'localized-value')
84145                       .on('blur', changeValue)
84146                       .on('change', changeValue);
84147               });
84148
84149           innerWrap
84150               .style('margin-top', '0px')
84151               .style('max-height', '0px')
84152               .style('opacity', '0')
84153               .transition()
84154               .duration(200)
84155               .style('margin-top', '10px')
84156               .style('max-height', '240px')
84157               .style('opacity', '1')
84158               .on('end', function() {
84159                   select(this)
84160                       .style('max-height', '')
84161                       .style('overflow', 'visible');
84162               });
84163
84164
84165           var entry = selection.selectAll('.entry');
84166
84167           utilGetSetValue(entry.select('.localized-lang'), function(d) {
84168               var lang = find$1(wikipedia$2, function(lang) { return lang[2] === d.lang; });
84169               return lang ? lang[1] : d.lang;
84170           });
84171
84172           utilGetSetValue(entry.select('.localized-value'),
84173               function(d) { return d.value; });
84174       }
84175
84176
84177       localized.tags = function(tags) {
84178           // Fetch translations from wikipedia
84179           if (tags.wikipedia && !_wikiTitles) {
84180               _wikiTitles = {};
84181               var wm = tags.wikipedia.match(/([^:]+):(.+)/);
84182               if (wm && wm[0] && wm[1]) {
84183                   wikipedia.translations(wm[1], wm[2], function(d) { _wikiTitles = d; });
84184               }
84185           }
84186
84187           utilGetSetValue(input, tags[field.key] || '');
84188
84189           calcMultilingual(tags);
84190
84191           _selection
84192               .call(localized);
84193       };
84194
84195
84196       localized.focus = function() {
84197           input.node().focus();
84198       };
84199
84200
84201       localized.entity = function(val) {
84202           if (!arguments.length) return _entity;
84203           _entity = val;
84204           _multilingual = [];
84205           return localized;
84206       };
84207
84208       return utilRebind(localized, dispatch$1, 'on');
84209   }
84210
84211   function uiFieldMaxspeed(field, context) {
84212       var dispatch$1 = dispatch('change');
84213       var unitInput = select(null);
84214       var input = select(null);
84215       var _entity;
84216       var _isImperial;
84217
84218       var speedCombo = uiCombobox(context, 'maxspeed');
84219       var unitCombo = uiCombobox(context, 'maxspeed-unit')
84220               .data(['km/h', 'mph'].map(comboValues));
84221
84222       var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120];
84223       var imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
84224
84225
84226       function maxspeed(selection) {
84227
84228           var wrap = selection.selectAll('.form-field-input-wrap')
84229               .data([0]);
84230
84231           wrap = wrap.enter()
84232               .append('div')
84233               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
84234               .merge(wrap);
84235
84236
84237           input = wrap.selectAll('#preset-input-' + field.safeid)
84238               .data([0]);
84239
84240           input = input.enter()
84241               .append('input')
84242               .attr('type', 'text')
84243               .attr('id', 'preset-input-' + field.safeid)
84244               .attr('placeholder', field.placeholder())
84245               .call(utilNoAuto)
84246               .call(speedCombo)
84247               .merge(input);
84248
84249           input
84250               .on('change', change)
84251               .on('blur', change);
84252
84253           var loc;
84254           if (_entity.type === 'node') {
84255               loc = _entity.loc;
84256           } else {
84257               var childNodes = context.graph().childNodes(context.entity(_entity.id));
84258               loc = childNodes[~~(childNodes.length/2)].loc;
84259           }
84260
84261           _isImperial = some(dataImperial.features, function(f) {
84262               return some(f.geometry.coordinates, function(d) {
84263                   return geoPointInPolygon(loc, d);
84264               });
84265           });
84266
84267           unitInput = wrap.selectAll('input.maxspeed-unit')
84268               .data([0]);
84269
84270           unitInput = unitInput.enter()
84271               .append('input')
84272               .attr('type', 'text')
84273               .attr('class', 'maxspeed-unit')
84274               .call(unitCombo)
84275               .merge(unitInput);
84276
84277           unitInput
84278               .on('blur', changeUnits)
84279               .on('change', changeUnits);
84280
84281
84282           function changeUnits() {
84283               _isImperial = utilGetSetValue(unitInput) === 'mph';
84284               utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
84285               setSuggestions();
84286               change();
84287           }
84288       }
84289
84290
84291       function setSuggestions() {
84292           speedCombo.data((_isImperial ? imperialValues : metricValues).map(comboValues));
84293           utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
84294       }
84295
84296
84297       function comboValues(d) {
84298           return {
84299               value: d.toString(),
84300               title: d.toString()
84301           };
84302       }
84303
84304
84305       function change() {
84306           var tag = {};
84307           var value = utilGetSetValue(input);
84308
84309           if (!value) {
84310               tag[field.key] = undefined;
84311           } else if (isNaN(value) || !_isImperial) {
84312               tag[field.key] = value;
84313           } else {
84314               tag[field.key] = value + ' mph';
84315           }
84316
84317           dispatch$1.call('change', this, tag);
84318       }
84319
84320
84321       maxspeed.tags = function(tags) {
84322           var value = tags[field.key];
84323
84324           if (value && value.indexOf('mph') >= 0) {
84325               value = parseInt(value, 10);
84326               _isImperial = true;
84327           } else if (value) {
84328               _isImperial = false;
84329           }
84330
84331           setSuggestions();
84332           utilGetSetValue(input, value || '');
84333       };
84334
84335
84336       maxspeed.focus = function() {
84337           input.node().focus();
84338       };
84339
84340
84341       maxspeed.entity = function(val) {
84342           _entity = val;
84343       };
84344
84345
84346       return utilRebind(maxspeed, dispatch$1, 'on');
84347   }
84348
84349   /**
84350    * This function is like `baseIndexOf` except that it accepts a comparator.
84351    *
84352    * @private
84353    * @param {Array} array The array to inspect.
84354    * @param {*} value The value to search for.
84355    * @param {number} fromIndex The index to search from.
84356    * @param {Function} comparator The comparator invoked per element.
84357    * @returns {number} Returns the index of the matched value, else `-1`.
84358    */
84359   function baseIndexOfWith(array, value, fromIndex, comparator) {
84360     var index = fromIndex - 1,
84361         length = array.length;
84362
84363     while (++index < length) {
84364       if (comparator(array[index], value)) {
84365         return index;
84366       }
84367     }
84368     return -1;
84369   }
84370
84371   /** Used for built-in method references. */
84372   var arrayProto$2 = Array.prototype;
84373
84374   /** Built-in value references. */
84375   var splice$2 = arrayProto$2.splice;
84376
84377   /**
84378    * The base implementation of `_.pullAllBy` without support for iteratee
84379    * shorthands.
84380    *
84381    * @private
84382    * @param {Array} array The array to modify.
84383    * @param {Array} values The values to remove.
84384    * @param {Function} [iteratee] The iteratee invoked per element.
84385    * @param {Function} [comparator] The comparator invoked per element.
84386    * @returns {Array} Returns `array`.
84387    */
84388   function basePullAll(array, values, iteratee, comparator) {
84389     var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
84390         index = -1,
84391         length = values.length,
84392         seen = array;
84393
84394     if (array === values) {
84395       values = copyArray(values);
84396     }
84397     if (iteratee) {
84398       seen = arrayMap(array, baseUnary(iteratee));
84399     }
84400     while (++index < length) {
84401       var fromIndex = 0,
84402           value = values[index],
84403           computed = iteratee ? iteratee(value) : value;
84404
84405       while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
84406         if (seen !== array) {
84407           splice$2.call(seen, fromIndex, 1);
84408         }
84409         splice$2.call(array, fromIndex, 1);
84410       }
84411     }
84412     return array;
84413   }
84414
84415   /**
84416    * This method is like `_.pull` except that it accepts an array of values to remove.
84417    *
84418    * **Note:** Unlike `_.difference`, this method mutates `array`.
84419    *
84420    * @static
84421    * @memberOf _
84422    * @since 4.0.0
84423    * @category Array
84424    * @param {Array} array The array to modify.
84425    * @param {Array} values The values to remove.
84426    * @returns {Array} Returns `array`.
84427    * @example
84428    *
84429    * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
84430    *
84431    * _.pullAll(array, ['a', 'c']);
84432    * console.log(array);
84433    * // => ['b', 'b']
84434    */
84435   function pullAll(array, values) {
84436     return (array && array.length && values && values.length)
84437       ? basePullAll(array, values)
84438       : array;
84439   }
84440
84441   /**
84442    * Removes all given values from `array` using
84443    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
84444    * for equality comparisons.
84445    *
84446    * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
84447    * to remove elements from an array by predicate.
84448    *
84449    * @static
84450    * @memberOf _
84451    * @since 2.0.0
84452    * @category Array
84453    * @param {Array} array The array to modify.
84454    * @param {...*} [values] The values to remove.
84455    * @returns {Array} Returns `array`.
84456    * @example
84457    *
84458    * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
84459    *
84460    * _.pull(array, 'a', 'c');
84461    * console.log(array);
84462    * // => ['b', 'b']
84463    */
84464   var pull = baseRest(pullAll);
84465
84466   function uiFieldRadio(field, context) {
84467       var dispatch$1 = dispatch('change');
84468       var placeholder = select(null);
84469       var wrap = select(null);
84470       var labels = select(null);
84471       var radios = select(null);
84472       var radioData = clone(field.options || field.keys);
84473       var typeField;
84474       var layerField;
84475       var _oldType = {};
84476       var _entity;
84477
84478
84479       function selectedKey() {
84480           var node = wrap.selectAll('.form-field-input-radio label.active input');
84481           return !node.empty() && node.datum();
84482       }
84483
84484
84485       function radio(selection) {
84486           selection.classed('preset-radio', true);
84487
84488           wrap = selection.selectAll('.form-field-input-wrap')
84489               .data([0]);
84490
84491           var enter = wrap.enter()
84492               .append('div')
84493               .attr('class', 'form-field-input-wrap form-field-input-radio');
84494
84495           enter
84496               .append('span')
84497               .attr('class', 'placeholder');
84498
84499           wrap = wrap
84500               .merge(enter);
84501
84502
84503           placeholder = wrap.selectAll('.placeholder');
84504
84505           labels = wrap.selectAll('label')
84506               .data(radioData);
84507
84508           enter = labels.enter()
84509               .append('label');
84510
84511           enter
84512               .append('input')
84513               .attr('type', 'radio')
84514               .attr('name', field.id)
84515               .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
84516               .attr('checked', false);
84517
84518           enter
84519               .append('span')
84520               .text(function(d) { return field.t('options.' + d, { 'default': d }); });
84521
84522           labels = labels
84523               .merge(enter);
84524
84525           radios = labels.selectAll('input')
84526               .on('change', changeRadio);
84527
84528       }
84529
84530
84531       function structureExtras(selection, tags) {
84532           var selected = selectedKey();
84533           var type = context.presets().field(selected);
84534           var layer = context.presets().field('layer');
84535           var showLayer = (selected === 'bridge' || selected === 'tunnel');
84536
84537
84538           var extrasWrap = selection.selectAll('.structure-extras-wrap')
84539               .data(selected ? [0] : []);
84540
84541           extrasWrap.exit()
84542               .remove();
84543
84544           extrasWrap = extrasWrap.enter()
84545               .append('div')
84546               .attr('class', 'structure-extras-wrap')
84547               .merge(extrasWrap);
84548
84549           var list = extrasWrap.selectAll('ul')
84550               .data([0]);
84551
84552           list = list.enter()
84553               .append('ul')
84554               .attr('class', 'labeled-inputs')
84555               .merge(list);
84556
84557
84558           // Type
84559           if (type) {
84560               if (!typeField || typeField.id !== selected) {
84561                   typeField = uiField(context, type, _entity, { wrap: false })
84562                       .on('change', changeType);
84563               }
84564               typeField.tags(tags);
84565           } else {
84566               typeField = null;
84567           }
84568
84569           var typeItem = list.selectAll('.structure-type-item')
84570               .data(typeField ? [typeField] : [], function(d) { return d.id; });
84571
84572           // Exit
84573           typeItem.exit()
84574               .remove();
84575
84576           // Enter
84577           var typeEnter = typeItem.enter()
84578               .insert('li', ':first-child')
84579               .attr('class', 'structure-type-item');
84580
84581           typeEnter
84582               .append('span')
84583               .attr('class', 'label structure-label-type')
84584               .attr('for', 'preset-input-' + selected)
84585               .text(t('inspector.radio.structure.type'));
84586
84587           typeEnter
84588               .append('div')
84589               .attr('class', 'structure-input-type-wrap');
84590
84591           // Update
84592           typeItem = typeItem
84593               .merge(typeEnter);
84594
84595           if (typeField) {
84596               typeItem.selectAll('.structure-input-type-wrap')
84597                   .call(typeField.render);
84598           }
84599
84600
84601           // Layer
84602           if (layer && showLayer) {
84603               if (!layerField) {
84604                   layerField = uiField(context, layer, _entity, { wrap: false })
84605                       .on('change', changeLayer);
84606               }
84607               layerField.tags(tags);
84608               field.keys = union(field.keys, ['layer']);
84609           } else {
84610               layerField = null;
84611               pull(field.keys, 'layer');
84612           }
84613
84614           var layerItem = list.selectAll('.structure-layer-item')
84615               .data(layerField ? [layerField] : []);
84616
84617           // Exit
84618           layerItem.exit()
84619               .remove();
84620
84621           // Enter
84622           var layerEnter = layerItem.enter()
84623               .append('li')
84624               .attr('class', 'structure-layer-item');
84625
84626           layerEnter
84627               .append('span')
84628               .attr('class', 'label structure-label-layer')
84629               .attr('for', 'preset-input-layer')
84630               .text(t('inspector.radio.structure.layer'));
84631
84632           layerEnter
84633               .append('div')
84634               .attr('class', 'structure-input-layer-wrap');
84635
84636           // Update
84637           layerItem = layerItem
84638               .merge(layerEnter);
84639
84640           if (layerField) {
84641               layerItem.selectAll('.structure-input-layer-wrap')
84642                   .call(layerField.render);
84643           }
84644       }
84645
84646
84647       function changeType(t, onInput) {
84648           var key = selectedKey();
84649           if (!key) return;
84650
84651           var val = t[key];
84652           if (val !== 'no') {
84653               _oldType[key] = val;
84654           }
84655
84656           if (field.type === 'structureRadio') {
84657               // remove layer if it should not be set
84658               if (val === 'no' ||
84659                   (key !== 'bridge' && key !== 'tunnel') ||
84660                   (key === 'tunnel' && val === 'building_passage')) {
84661                   t.layer = undefined;
84662               }
84663               // add layer if it should be set
84664               if (t.layer === undefined) {
84665                   if (key === 'bridge' && val !== 'no') {
84666                       t.layer = '1';
84667                   }
84668                   if (key === 'tunnel' && val !== 'no' && val !== 'building_passage') {
84669                       t.layer = '-1';
84670                   }
84671               }
84672            }
84673
84674           dispatch$1.call('change', this, t, onInput);
84675       }
84676
84677
84678       function changeLayer(t, onInput) {
84679           if (t.layer === '0') {
84680               t.layer = undefined;
84681           }
84682           dispatch$1.call('change', this, t, onInput);
84683       }
84684
84685
84686       function changeRadio() {
84687           var t = {};
84688           var activeKey;
84689
84690           if (field.key) {
84691               t[field.key] = undefined;
84692           }
84693
84694           radios.each(function(d) {
84695               var active = select(this).property('checked');
84696               if (active) activeKey = d;
84697
84698               if (field.key) {
84699                   if (active) t[field.key] = d;
84700               } else {
84701                   var val = _oldType[activeKey] || 'yes';
84702                   t[d] = active ? val : undefined;
84703               }
84704           });
84705
84706           if (field.type === 'structureRadio') {
84707               if (activeKey === 'bridge') {
84708                   t.layer = '1';
84709               } else if (activeKey === 'tunnel' && t.tunnel !== 'building_passage') {
84710                   t.layer = '-1';
84711               } else {
84712                   t.layer = undefined;
84713               }
84714           }
84715
84716           dispatch$1.call('change', this, t);
84717       }
84718
84719
84720       radio.tags = function(tags) {
84721           function checked(d) {
84722               if (field.key) {
84723                   return tags[field.key] === d;
84724               } else {
84725                   return !!(tags[d] && tags[d].toLowerCase() !== 'no');
84726               }
84727           }
84728
84729           labels.classed('active', checked);
84730           radios.property('checked', checked);
84731
84732           var selection = radios.filter(function() { return this.checked; });
84733
84734           if (selection.empty()) {
84735               placeholder.text(t('inspector.none'));
84736           } else {
84737               placeholder.text(selection.attr('value'));
84738               _oldType[selection.datum()] = tags[selection.datum()];
84739           }
84740
84741           if (field.type === 'structureRadio') {
84742               // For waterways without a tunnel tag, set 'culvert' as
84743               // the _oldType to default to if the user picks 'tunnel'
84744               if (!!tags.waterway && !_oldType.tunnel) {
84745                   _oldType.tunnel = 'culvert';
84746               }
84747
84748               wrap.call(structureExtras, tags);
84749           }
84750       };
84751
84752
84753       radio.focus = function() {
84754           radios.node().focus();
84755       };
84756
84757
84758       radio.entity = function(val) {
84759           if (!arguments.length) return _entity;
84760           _entity = val;
84761           _oldType = {};
84762           return radio;
84763       };
84764
84765
84766       return utilRebind(radio, dispatch$1, 'on');
84767   }
84768
84769   function uiFieldRestrictions(field, context) {
84770       var dispatch$1 = dispatch('change');
84771       var breathe = behaviorBreathe(context);
84772       var storedViaWay = context.storage('turn-restriction-via-way');
84773       var storedDistance = context.storage('turn-restriction-distance');
84774
84775       var _maxViaWay = storedViaWay !== null ? (+storedViaWay) : 1;
84776       var _maxDistance = storedDistance ? (+storedDistance) : 30;
84777       var _initialized = false;
84778       var _parent = select(null);       // the entire field
84779       var _container = select(null);    // just the map
84780       var _oldTurns;
84781       var _graph;
84782       var _vertexID;
84783       var _intersection;
84784       var _fromWayID;
84785
84786       var _lastXPos;
84787
84788
84789       function restrictions(selection) {
84790           _parent = selection;
84791
84792           // try to reuse the intersection, but always rebuild it if the graph has changed
84793           if (_vertexID && (context.graph() !== _graph || !_intersection)) {
84794               _graph = context.graph();
84795               _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
84796           }
84797
84798           // It's possible for there to be no actual intersection here.
84799           // for example, a vertex of two `highway=path`
84800           // In this case, hide the field.
84801           var isOK = (
84802               _intersection &&
84803               _intersection.vertices.length &&           // has vertices
84804               _intersection.vertices                     // has the vertex that the user selected
84805                   .filter(function(vertex) { return vertex.id === _vertexID; }).length &&
84806               _intersection.ways.length > 2 &&           // has more than 2 ways
84807               _intersection.ways                         // has more than 1 TO way
84808                   .filter(function(way) { return way.__to; }).length > 1
84809           );
84810
84811           // Also hide in the case where
84812           select(selection.node().parentNode).classed('hide', !isOK);
84813
84814           // if form field is hidden or has detached from dom, clean up.
84815           if (!isOK ||
84816               !select('.inspector-wrap.inspector-hidden').empty() ||
84817               !selection.node().parentNode ||
84818               !selection.node().parentNode.parentNode) {
84819               selection.call(restrictions.off);
84820               return;
84821           }
84822
84823
84824           var wrap = selection.selectAll('.form-field-input-wrap')
84825               .data([0]);
84826
84827           wrap = wrap.enter()
84828               .append('div')
84829               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
84830               .merge(wrap);
84831
84832           var container = wrap.selectAll('.restriction-container')
84833               .data([0]);
84834
84835           // enter
84836           var containerEnter = container.enter()
84837               .append('div')
84838               .attr('class', 'restriction-container');
84839
84840           containerEnter
84841               .append('div')
84842               .attr('class', 'restriction-help');
84843
84844           // update
84845           _container = containerEnter
84846               .merge(container)
84847               .call(renderViewer);
84848
84849           var controls = wrap.selectAll('.restriction-controls')
84850               .data([0]);
84851
84852           // enter/update
84853           controls.enter()
84854               .append('div')
84855               .attr('class', 'restriction-controls-container')
84856               .append('div')
84857               .attr('class', 'restriction-controls')
84858               .merge(controls)
84859               .call(renderControls);
84860       }
84861
84862
84863       function renderControls(selection) {
84864           var distControl = selection.selectAll('.restriction-distance')
84865               .data([0]);
84866
84867           distControl.exit()
84868               .remove();
84869
84870           var distControlEnter = distControl.enter()
84871               .append('div')
84872               .attr('class', 'restriction-control restriction-distance');
84873
84874           distControlEnter
84875               .append('span')
84876               .attr('class', 'restriction-control-label restriction-distance-label')
84877               .text(t('restriction.controls.distance') + ':');
84878
84879           distControlEnter
84880               .append('input')
84881               .attr('class', 'restriction-distance-input')
84882               .attr('type', 'range')
84883               .attr('min', '20')
84884               .attr('max', '50')
84885               .attr('step', '5');
84886
84887           distControlEnter
84888               .append('span')
84889               .attr('class', 'restriction-distance-text');
84890
84891           // update
84892           selection.selectAll('.restriction-distance-input')
84893               .property('value', _maxDistance)
84894               .on('input', function() {
84895                   var val = select(this).property('value');
84896                   _maxDistance = +val;
84897                   _intersection = null;
84898                   _container.selectAll('.layer-osm .layer-turns *').remove();
84899                   context.storage('turn-restriction-distance', _maxDistance);
84900                   _parent.call(restrictions);
84901               });
84902
84903           selection.selectAll('.restriction-distance-text')
84904               .text(displayMaxDistance(_maxDistance));
84905
84906
84907           var viaControl = selection.selectAll('.restriction-via-way')
84908               .data([0]);
84909
84910           viaControl.exit()
84911               .remove();
84912
84913           var viaControlEnter = viaControl.enter()
84914               .append('div')
84915               .attr('class', 'restriction-control restriction-via-way');
84916
84917           viaControlEnter
84918               .append('span')
84919               .attr('class', 'restriction-control-label restriction-via-way-label')
84920               .text(t('restriction.controls.via') + ':');
84921
84922           viaControlEnter
84923               .append('input')
84924               .attr('class', 'restriction-via-way-input')
84925               .attr('type', 'range')
84926               .attr('min', '0')
84927               .attr('max', '2')
84928               .attr('step', '1');
84929
84930           viaControlEnter
84931               .append('span')
84932               .attr('class', 'restriction-via-way-text');
84933
84934           // update
84935           selection.selectAll('.restriction-via-way-input')
84936               .property('value', _maxViaWay)
84937               .on('input', function() {
84938                   var val = select(this).property('value');
84939                   _maxViaWay = +val;
84940                   _container.selectAll('.layer-osm .layer-turns *').remove();
84941                   context.storage('turn-restriction-via-way', _maxViaWay);
84942                   _parent.call(restrictions);
84943               });
84944
84945           selection.selectAll('.restriction-via-way-text')
84946               .text(displayMaxVia(_maxViaWay));
84947       }
84948
84949
84950       function renderViewer(selection) {
84951           if (!_intersection) return;
84952
84953           var vgraph = _intersection.graph;
84954           var filter = utilFunctor(true);
84955           var projection = geoRawMercator();
84956
84957           // Reflow warning: `utilGetDimensions` calls `getBoundingClientRect`
84958           // Instead of asking the restriction-container for its dimensions,
84959           //  we can ask the #sidebar, which can have its dimensions cached.
84960           // width: calc as sidebar - padding
84961           // height: hardcoded (from `80_app.css`)
84962           // var d = utilGetDimensions(selection);
84963           var sdims = utilGetDimensions(select('#sidebar'));
84964           var d = [ sdims[0] - 50, 370 ];
84965           var c = geoVecScale(d, 0.5);
84966           var z = 22;
84967
84968           projection.scale(geoZoomToScale(z));
84969
84970           // Calculate extent of all key vertices
84971           var extent = geoExtent();
84972           for (var i = 0; i < _intersection.vertices.length; i++) {
84973               extent._extend(_intersection.vertices[i].extent());
84974           }
84975
84976           // If this is a large intersection, adjust zoom to fit extent
84977           if (_intersection.vertices.length > 1) {
84978               var padding = 180;   // in z22 pixels
84979               var tl = projection([extent[0][0], extent[1][1]]);
84980               var br = projection([extent[1][0], extent[0][1]]);
84981               var hFactor = (br[0] - tl[0]) / (d[0] - padding);
84982               var vFactor = (br[1] - tl[1]) / (d[1] - padding);
84983               var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
84984               var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
84985               z = z - Math.max(hZoomDiff, vZoomDiff);
84986               projection.scale(geoZoomToScale(z));
84987           }
84988
84989           var padTop = 35;   // reserve top space for hint text
84990           var extentCenter = projection(extent.center());
84991           extentCenter[1] = extentCenter[1] - padTop;
84992
84993           projection
84994               .translate(geoVecSubtract(c, extentCenter))
84995               .clipExtent([[0, 0], d]);
84996
84997           var drawLayers = svgLayers(projection, context).only(['osm','touch']).dimensions(d);
84998           var drawVertices = svgVertices(projection, context);
84999           var drawLines = svgLines(projection, context);
85000           var drawTurns = svgTurns(projection, context);
85001
85002           var firstTime = selection.selectAll('.surface').empty();
85003
85004           selection
85005               .call(drawLayers);
85006
85007           var surface = selection.selectAll('.surface')
85008               .classed('tr', true);
85009
85010           if (firstTime) {
85011               _initialized = true;
85012
85013               surface
85014                   .call(breathe);
85015           }
85016
85017           // This can happen if we've lowered the detail while a FROM way
85018           // is selected, and that way is no longer part of the intersection.
85019           if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
85020               _fromWayID = null;
85021               _oldTurns = null;
85022           }
85023
85024           surface
85025               .call(utilSetDimensions, d)
85026               .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z)
85027               .call(drawLines, vgraph, _intersection.ways, filter)
85028               .call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay));
85029
85030           surface
85031               .on('click.restrictions', click)
85032               .on('mouseover.restrictions', mouseover);
85033
85034           surface
85035               .selectAll('.selected')
85036               .classed('selected', false);
85037
85038           surface
85039               .selectAll('.related')
85040               .classed('related', false);
85041
85042           if (_fromWayID) {
85043               var way = vgraph.entity(_fromWayID);
85044               surface
85045                   .selectAll('.' + _fromWayID)
85046                   .classed('selected', true)
85047                   .classed('related', true);
85048           }
85049
85050           document.addEventListener('resizeWindow', function () {
85051               utilSetDimensions(_container, null);
85052               redraw(1);
85053           }, false);
85054
85055           updateHints(null);
85056
85057
85058           function click() {
85059               surface
85060                   .call(breathe.off)
85061                   .call(breathe);
85062
85063               var datum = event.target.__data__;
85064               var entity = datum && datum.properties && datum.properties.entity;
85065               if (entity) {
85066                   datum = entity;
85067               }
85068
85069               if (datum instanceof osmWay && (datum.__from || datum.__via)) {
85070                   _fromWayID = datum.id;
85071                   _oldTurns = null;
85072                   redraw();
85073
85074               } else if (datum instanceof osmTurn) {
85075                   var actions, extraActions, turns, i;
85076                   var restrictionType = osmInferRestriction(vgraph, datum, projection);
85077
85078                   if (datum.restrictionID && !datum.direct) {
85079                       return;
85080
85081                   } else if (datum.restrictionID && !datum.only) {    // NO -> ONLY
85082                       var seen = {};
85083                       var datumOnly = cloneDeep(datum);
85084                       datumOnly.only = true;
85085                       restrictionType = restrictionType.replace(/^no/, 'only');
85086
85087                       // Adding an ONLY restriction should destroy all other direct restrictions from the FROM towards the VIA.
85088                       // We will remember them in _oldTurns, and restore them if the user clicks again.
85089                       turns = _intersection.turns(_fromWayID, 2);
85090                       extraActions = [];
85091                       _oldTurns = [];
85092                       for (i = 0; i < turns.length; i++) {
85093                           var turn = turns[i];
85094                           if (seen[turn.restrictionID]) continue;  // avoid deleting the turn twice (#4968, #4928)
85095
85096                           if (turn.direct && turn.path[1] === datum.path[1]) {
85097                               seen[turns[i].restrictionID] = true;
85098                               turn.restrictionType = osmInferRestriction(vgraph, turn, projection);
85099                               _oldTurns.push(turn);
85100                               extraActions.push(actionUnrestrictTurn(turn));
85101                           }
85102                       }
85103
85104                       actions = _intersection.actions.concat(extraActions, [
85105                           actionRestrictTurn(datumOnly, restrictionType),
85106                           t('operations.restriction.annotation.create')
85107                       ]);
85108
85109                   } else if (datum.restrictionID) {   // ONLY -> Allowed
85110                       // Restore whatever restrictions we might have destroyed by cycling thru the ONLY state.
85111                       // This relies on the assumption that the intersection was already split up when we
85112                       // performed the previous action (NO -> ONLY), so the IDs in _oldTurns shouldn't have changed.
85113                       turns = _oldTurns || [];
85114                       extraActions = [];
85115                       for (i = 0; i < turns.length; i++) {
85116                           if (turns[i].key !== datum.key) {
85117                               extraActions.push(actionRestrictTurn(turns[i], turns[i].restrictionType));
85118                           }
85119                       }
85120                       _oldTurns = null;
85121
85122                       actions = _intersection.actions.concat(extraActions, [
85123                           actionUnrestrictTurn(datum),
85124                           t('operations.restriction.annotation.delete')
85125                       ]);
85126
85127                   } else {    // Allowed -> NO
85128                       actions = _intersection.actions.concat([
85129                           actionRestrictTurn(datum, restrictionType),
85130                           t('operations.restriction.annotation.create')
85131                       ]);
85132                   }
85133
85134                   context.perform.apply(context, actions);
85135
85136                   // At this point the datum will be changed, but will have same key..
85137                   // Refresh it and update the help..
85138                   var s = surface.selectAll('.' + datum.key);
85139                   datum = s.empty() ? null : s.datum();
85140                   updateHints(datum);
85141
85142               } else {
85143                   _fromWayID = null;
85144                   _oldTurns = null;
85145                   redraw();
85146               }
85147           }
85148
85149
85150           function mouseover() {
85151               var datum = event.target.__data__;
85152               updateHints(datum);
85153           }
85154
85155           _lastXPos = _lastXPos || sdims[0];
85156
85157           function redraw(minChange) {
85158               var xPos = -1;
85159
85160               if (minChange) {
85161                   xPos = utilGetDimensions(select('#sidebar'))[0];
85162               }
85163
85164               if (!minChange || (minChange && Math.abs(xPos - _lastXPos) >= minChange)) {
85165                   if (context.hasEntity(_vertexID)) {
85166                       _lastXPos = xPos;
85167                       _container.call(renderViewer);
85168                   }
85169               }
85170           }
85171
85172
85173           function highlightPathsFrom(wayID) {
85174               surface.selectAll('.related')
85175                   .classed('related', false)
85176                   .classed('allow', false)
85177                   .classed('restrict', false)
85178                   .classed('only', false);
85179
85180               surface.selectAll('.' + wayID)
85181                   .classed('related', true);
85182
85183               if (wayID) {
85184                   var turns = _intersection.turns(wayID, _maxViaWay);
85185                   for (var i = 0; i < turns.length; i++) {
85186                       var turn = turns[i];
85187                       var ids = [turn.to.way];
85188                       var klass = (turn.no ? 'restrict' : (turn.only ? 'only' : 'allow'));
85189
85190                       if (turn.only || turns.length === 1) {
85191                           if (turn.via.ways) {
85192                               ids = ids.concat(turn.via.ways);
85193                           }
85194                       } else if (turn.to.way === wayID) {
85195                           continue;
85196                       }
85197
85198                       surface.selectAll(utilEntitySelector(ids))
85199                           .classed('related', true)
85200                           .classed('allow', (klass === 'allow'))
85201                           .classed('restrict', (klass === 'restrict'))
85202                           .classed('only', (klass === 'only'));
85203                   }
85204               }
85205           }
85206
85207
85208           function updateHints(datum) {
85209               var help = _container.selectAll('.restriction-help').html('');
85210
85211               var placeholders = {};
85212               ['from', 'via', 'to'].forEach(function(k) {
85213                   placeholders[k] = '<span class="qualifier">' + t('restriction.help.' + k) + '</span>';
85214               });
85215
85216               var entity = datum && datum.properties && datum.properties.entity;
85217               if (entity) {
85218                   datum = entity;
85219               }
85220
85221               if (_fromWayID) {
85222                   way = vgraph.entity(_fromWayID);
85223                   surface
85224                       .selectAll('.' + _fromWayID)
85225                       .classed('selected', true)
85226                       .classed('related', true);
85227               }
85228
85229               // Hovering a way
85230               if (datum instanceof osmWay && datum.__from) {
85231                   way = datum;
85232
85233                   highlightPathsFrom(_fromWayID ? null : way.id);
85234                   surface.selectAll('.' + way.id)
85235                       .classed('related', true);
85236
85237                   var clickSelect = (!_fromWayID || _fromWayID !== way.id);
85238                   help
85239                       .append('div')      // "Click to select FROM {fromName}." / "FROM {fromName}"
85240                       .html(t('restriction.help.' + (clickSelect ? 'select_from_name' : 'from_name'), {
85241                           from: placeholders.from,
85242                           fromName: displayName(way.id, vgraph)
85243                       }));
85244
85245
85246               // Hovering a turn arrow
85247               } else if (datum instanceof osmTurn) {
85248                   var restrictionType = osmInferRestriction(vgraph, datum, projection);
85249                   var turnType = restrictionType.replace(/^(only|no)\_/, '');
85250                   var indirect = (datum.direct === false ? t('restriction.help.indirect') : '');
85251                   var klass, turnText, nextText;
85252
85253                   if (datum.no) {
85254                       klass = 'restrict';
85255                       turnText = t('restriction.help.turn.no_' + turnType, { indirect: indirect });
85256                       nextText = t('restriction.help.turn.only_' + turnType, { indirect: '' });
85257                   } else if (datum.only) {
85258                       klass = 'only';
85259                       turnText = t('restriction.help.turn.only_' + turnType, { indirect: indirect });
85260                       nextText = t('restriction.help.turn.allowed_' + turnType, { indirect: '' });
85261                   } else {
85262                       klass = 'allow';
85263                       turnText = t('restriction.help.turn.allowed_' + turnType, { indirect: indirect });
85264                       nextText = t('restriction.help.turn.no_' + turnType, { indirect: '' });
85265                   }
85266
85267                   help
85268                       .append('div')      // "NO Right Turn (indirect)"
85269                       .attr('class', 'qualifier ' + klass)
85270                       .text(turnText);
85271
85272                   help
85273                       .append('div')      // "FROM {fromName} TO {toName}"
85274                       .html(t('restriction.help.from_name_to_name', {
85275                           from: placeholders.from,
85276                           fromName: displayName(datum.from.way, vgraph),
85277                           to: placeholders.to,
85278                           toName: displayName(datum.to.way, vgraph)
85279                       }));
85280
85281                   if (datum.via.ways && datum.via.ways.length) {
85282                       var names = [];
85283                       for (var i = 0; i < datum.via.ways.length; i++) {
85284                           var prev = names[names.length - 1];
85285                           var curr = displayName(datum.via.ways[i], vgraph);
85286                           if (!prev || curr !== prev)   // collapse identical names
85287                               names.push(curr);
85288                       }
85289
85290                       help
85291                           .append('div')      // "VIA {viaNames}"
85292                           .html(t('restriction.help.via_names', {
85293                               via: placeholders.via,
85294                               viaNames: names.join(', ')
85295                           }));
85296                   }
85297
85298                   if (!indirect) {
85299                       help
85300                           .append('div')      // Click for "No Right Turn"
85301                           .text(t('restriction.help.toggle', { turn: nextText.trim() }));
85302                   }
85303
85304                   highlightPathsFrom(null);
85305                   var alongIDs = datum.path.slice();
85306                   surface.selectAll(utilEntitySelector(alongIDs))
85307                       .classed('related', true)
85308                       .classed('allow', (klass === 'allow'))
85309                       .classed('restrict', (klass === 'restrict'))
85310                       .classed('only', (klass === 'only'));
85311
85312
85313               // Hovering empty surface
85314               } else {
85315                   highlightPathsFrom(null);
85316                   if (_fromWayID) {
85317                       help
85318                           .append('div')      // "FROM {fromName}"
85319                           .html(t('restriction.help.from_name', {
85320                               from: placeholders.from,
85321                               fromName: displayName(_fromWayID, vgraph)
85322                           }));
85323
85324                   } else {
85325                       help
85326                           .append('div')      // "Click to select a FROM segment."
85327                           .html(t('restriction.help.select_from', {
85328                               from: placeholders.from
85329                           }));
85330                   }
85331               }
85332           }
85333       }
85334
85335
85336       function displayMaxDistance(maxDist) {
85337           var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
85338           var opts;
85339
85340           if (isImperial) {
85341               var distToFeet = {   // imprecise conversion for prettier display
85342                   20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160
85343               }[maxDist];
85344               opts = { distance: t('units.feet', { quantity: distToFeet }) };
85345           } else {
85346               opts = { distance: t('units.meters', { quantity: maxDist }) };
85347           }
85348
85349           return t('restriction.controls.distance_up_to', opts);
85350       }
85351
85352
85353       function displayMaxVia(maxVia) {
85354           return maxVia === 0 ? t('restriction.controls.via_node_only')
85355               : maxVia === 1 ? t('restriction.controls.via_up_to_one')
85356               : t('restriction.controls.via_up_to_two');
85357       }
85358
85359
85360       function displayName(entityID, graph) {
85361           var entity = graph.entity(entityID);
85362           var name = utilDisplayName(entity) || '';
85363           var matched = context.presets().match(entity, graph);
85364           var type = (matched && matched.name()) || utilDisplayType(entity.id);
85365           return name || type;
85366       }
85367
85368
85369       restrictions.entity = function(_) {
85370           _intersection = null;
85371           _fromWayID = null;
85372           _oldTurns = null;
85373           _vertexID = _.id;
85374       };
85375
85376
85377       restrictions.tags = function() {};
85378       restrictions.focus = function() {};
85379
85380
85381       restrictions.off = function(selection) {
85382           if (!_initialized) return;
85383
85384           selection.selectAll('.surface')
85385               .call(breathe.off)
85386               .on('click.restrictions', null)
85387               .on('mouseover.restrictions', null);
85388
85389           select(window)
85390               .on('resize.restrictions', null);
85391       };
85392
85393
85394       return utilRebind(restrictions, dispatch$1, 'on');
85395   }
85396
85397   function uiFieldTextarea(field) {
85398       var dispatch$1 = dispatch('change');
85399       var input = select(null);
85400
85401
85402       function textarea(selection) {
85403           var wrap = selection.selectAll('.form-field-input-wrap')
85404               .data([0]);
85405
85406           wrap = wrap.enter()
85407               .append('div')
85408               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
85409               .merge(wrap);
85410
85411           input = wrap.selectAll('textarea')
85412               .data([0]);
85413
85414           input = input.enter()
85415               .append('textarea')
85416               .attr('id', 'preset-input-' + field.safeid)
85417               .attr('placeholder', field.placeholder() || t('inspector.unknown'))
85418               .attr('maxlength', 255)
85419               .call(utilNoAuto)
85420               .on('input', change(true))
85421               .on('blur', change())
85422               .on('change', change())
85423               .merge(input);
85424       }
85425
85426
85427       function change(onInput) {
85428           return function() {
85429               var t = {};
85430               t[field.key] = utilGetSetValue(input) || undefined;
85431               dispatch$1.call('change', this, t, onInput);
85432           };
85433       }
85434
85435
85436       textarea.tags = function(tags) {
85437           utilGetSetValue(input, tags[field.key] || '');
85438       };
85439
85440
85441       textarea.focus = function() {
85442           input.node().focus();
85443       };
85444
85445
85446       return utilRebind(textarea, dispatch$1, 'on');
85447   }
85448
85449   function uiFieldWikidata(field) {
85450       var wikidata = services.wikidata;
85451       var dispatch$1 = dispatch('change');
85452       var link = select(null);
85453       var title = select(null);
85454       var _wikiURL = '';
85455
85456
85457       function wiki(selection) {
85458
85459           var wrap = selection.selectAll('.form-field-input-wrap')
85460               .data([0]);
85461
85462           wrap = wrap.enter()
85463               .append('div')
85464               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
85465               .merge(wrap);
85466
85467
85468           var list = wrap.selectAll('ul')
85469               .data([0]);
85470
85471           list = list.enter()
85472               .append('ul')
85473               .attr('class', 'labeled-inputs')
85474               .merge(list);
85475
85476           var wikidataProperties = ['identifier', 'label', 'description'];
85477
85478           var items = list.selectAll('li')
85479               .data(wikidataProperties);
85480
85481           // Enter
85482           var enter = items.enter()
85483               .append('li')
85484               .attr('class', function(d) { return 'preset-wikidata-' + d; });
85485
85486           enter
85487               .append('span')
85488               .attr('class', 'label')
85489               .attr('for', function(d) { return 'preset-input-wikidata-' + d; })
85490               .text(function(d) { return t('wikidata.' + d); });
85491
85492           var inputWrap = enter
85493               .append('div')
85494               .attr('class', 'input-wrap');
85495
85496           inputWrap
85497               .append('input')
85498               .attr('type', 'text')
85499               .attr('class', 'preset-input-wikidata')
85500               .attr('id', function(d) { return 'preset-input-wikidata-' + d; });
85501
85502
85503           title = wrap.select('.preset-wikidata-identifier input')
85504               .call(utilNoAuto)
85505               .merge(title);
85506
85507           title
85508               .on('blur', blur)
85509               .on('change', change);
85510
85511           var idItem = wrap.select('.preset-wikidata-identifier');
85512
85513           idItem.select('button')
85514               .remove();
85515
85516           link = idItem
85517               .append('button')
85518               .attr('class', 'form-field-button wiki-link')
85519               .attr('title', t('icons.open_wikidata'))
85520               .attr('tabindex', -1)
85521               .call(svgIcon('#iD-icon-out-link'))
85522               .merge(link);
85523
85524           link
85525               .on('click', function() {
85526                   event.preventDefault();
85527                   if (_wikiURL) window.open(_wikiURL, '_blank');
85528               });
85529
85530           var readOnlyItems = wrap.selectAll('li:not(.preset-wikidata-identifier)');
85531
85532           readOnlyItems.select('input')
85533               .classed('disabled', 'true')
85534               .attr('readonly', 'true');
85535
85536           readOnlyItems.select('button')
85537               .remove();
85538
85539           readOnlyItems.append('button')
85540               .attr('class', 'form-field-button wiki-link')
85541               .attr('title', t('icons.copy'))
85542               .attr('tabindex', -1)
85543               .call(svgIcon('#iD-operation-copy'))
85544               .on('click', function() {
85545                   event.preventDefault();
85546                   select(this.parentNode)
85547                       .select('input')
85548                       .node()
85549                       .select();
85550                   document.execCommand('copy');
85551               });
85552       }
85553
85554
85555       function blur() {
85556           change();
85557       }
85558
85559
85560       function change() {
85561           var syncTags = {
85562               wikidata: utilGetSetValue(title)
85563           };
85564           dispatch$1.call('change', this, syncTags);
85565       }
85566
85567
85568       wiki.tags = function(tags) {
85569           var value = tags[field.key] || '';
85570           utilGetSetValue(title, value);
85571
85572           if (!/^Q[0-9]*$/.test(value)) {   // not a proper QID
85573               unrecognized();
85574               return;
85575           }
85576
85577           // QID value in correct format
85578           _wikiURL = 'https://wikidata.org/wiki/' + value;
85579           wikidata.entityByQID(value, function(err, entity) {
85580               if (err) {
85581                   unrecognized();
85582                   return;
85583               }
85584
85585               var label = '';
85586               var description = '';
85587
85588               if (entity.labels && Object.keys(entity.labels).length > 0) {
85589                   label = entity.labels[Object.keys(entity.labels)[0]].value;
85590               }
85591               if (entity.descriptions && Object.keys(entity.descriptions).length > 0) {
85592                   description = entity.descriptions[Object.keys(entity.descriptions)[0]].value;
85593               }
85594
85595               select('.preset-wikidata-label')
85596                   .style('display', function(){
85597                       return label.length > 0 ? 'flex' : 'none';
85598                   })
85599                   .select('input')
85600                   .attr('value', label);
85601
85602               select('.preset-wikidata-description')
85603                   .style('display', function(){
85604                       return description.length > 0 ? 'flex' : 'none';
85605                   })
85606                   .select('input')
85607                   .attr('value', description);
85608           });
85609
85610
85611           // not a proper QID
85612           function unrecognized() {
85613               select('.preset-wikidata-label')
85614                   .style('display', 'none');
85615               select('.preset-wikidata-description')
85616                   .style('display', 'none');
85617
85618               if (value && value !== '') {
85619                   _wikiURL = 'https://wikidata.org/wiki/Special:Search?search=' + value;
85620               } else {
85621                   _wikiURL = '';
85622               }
85623           }
85624       };
85625
85626
85627       wiki.focus = function() {
85628           title.node().focus();
85629       };
85630
85631
85632       return utilRebind(wiki, dispatch$1, 'on');
85633   }
85634
85635   function uiFieldWikipedia(field, context) {
85636       var dispatch$1 = dispatch('change');
85637       var wikipedia = services.wikipedia;
85638       var wikidata = services.wikidata;
85639       var lang = select(null);
85640       var title = select(null);
85641       var _wikiURL = '';
85642       var _entity;
85643
85644       var langCombo = uiCombobox(context, 'wikipedia-lang')
85645           .fetcher(function(value, cb) {
85646               var v = value.toLowerCase();
85647
85648               cb(wikipedia$2.filter(function(d) {
85649                   return d[0].toLowerCase().indexOf(v) >= 0 ||
85650                       d[1].toLowerCase().indexOf(v) >= 0 ||
85651                       d[2].toLowerCase().indexOf(v) >= 0;
85652               }).map(function(d) {
85653                   return { value: d[1] };
85654               }));
85655           });
85656
85657       var titleCombo = uiCombobox(context, 'wikipedia-title')
85658           .fetcher(function(value, cb) {
85659               if (!value && _entity) {
85660                   value = context.entity(_entity.id).tags.name || '';
85661               }
85662
85663               var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
85664               searchfn(language()[2], value, function(query, data) {
85665                   cb(data.map(function(d) {
85666                       return { value: d };
85667                   }));
85668               });
85669           });
85670
85671
85672       function wiki(selection) {
85673           var wrap = selection.selectAll('.form-field-input-wrap')
85674               .data([0]);
85675
85676           wrap = wrap.enter()
85677               .append('div')
85678               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
85679               .merge(wrap);
85680
85681
85682           var langRow = wrap.selectAll('.wiki-lang-container')
85683               .data([0]);
85684
85685           langRow = langRow.enter()
85686               .append('div')
85687               .attr('class', 'wiki-lang-container')
85688               .merge(langRow);
85689
85690
85691           lang = langRow.selectAll('input.wiki-lang')
85692               .data([0]);
85693
85694           lang = lang.enter()
85695               .append('input')
85696               .attr('type', 'text')
85697               .attr('class', 'wiki-lang')
85698               .attr('placeholder', t('translate.localized_translation_language'))
85699               .call(utilNoAuto)
85700               .call(langCombo)
85701               .merge(lang);
85702
85703           utilGetSetValue(lang, language()[1]);
85704
85705           lang
85706               .on('blur', changeLang)
85707               .on('change', changeLang);
85708
85709
85710           var titleRow = wrap.selectAll('.wiki-title-container')
85711               .data([0]);
85712
85713           titleRow = titleRow.enter()
85714               .append('div')
85715               .attr('class', 'wiki-title-container')
85716               .merge(titleRow);
85717
85718           title = titleRow.selectAll('input.wiki-title')
85719               .data([0]);
85720
85721           title = title.enter()
85722               .append('input')
85723               .attr('type', 'text')
85724               .attr('class', 'wiki-title')
85725               .attr('id', 'preset-input-' + field.safeid)
85726               .call(utilNoAuto)
85727               .call(titleCombo)
85728               .merge(title);
85729
85730           title
85731               .on('blur', blur)
85732               .on('change', change);
85733
85734
85735           var link = titleRow.selectAll('.wiki-link')
85736               .data([0]);
85737
85738           link = link.enter()
85739               .append('button')
85740               .attr('class', 'form-field-button wiki-link')
85741               .attr('tabindex', -1)
85742               .call(svgIcon('#iD-icon-out-link'))
85743               .merge(link);
85744
85745           link
85746               .on('click', function() {
85747                   event.preventDefault();
85748                   if (_wikiURL) window.open(_wikiURL, '_blank');
85749               });
85750       }
85751
85752
85753       function language() {
85754           var value = utilGetSetValue(lang).toLowerCase();
85755           var locale = utilDetect().locale.toLowerCase();
85756           var localeLanguage;
85757           return find$1(wikipedia$2, function(d) {
85758               if (d[2] === locale) localeLanguage = d;
85759               return d[0].toLowerCase() === value ||
85760                   d[1].toLowerCase() === value ||
85761                   d[2] === value;
85762           }) || localeLanguage || ['English', 'English', 'en'];
85763       }
85764
85765
85766       function changeLang() {
85767           utilGetSetValue(lang, language()[1]);
85768           change(true);
85769       }
85770
85771
85772       function blur() {
85773           change(true);
85774       }
85775
85776
85777       function change(skipWikidata) {
85778           var value = utilGetSetValue(title);
85779           var m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/);
85780           var l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; });
85781           var syncTags = {};
85782
85783           if (l) {
85784               // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
85785               value = decodeURIComponent(m[2]).replace(/_/g, ' ');
85786               if (m[3]) {
85787                   var anchor;
85788                   try {
85789                       // Best-effort `anchordecode:` implementation
85790                       anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
85791                   } catch (e) {
85792                       anchor = decodeURIComponent(m[3]);
85793                   }
85794                   value += '#' + anchor.replace(/_/g, ' ');
85795               }
85796               value = value.slice(0, 1).toUpperCase() + value.slice(1);
85797               utilGetSetValue(lang, l[1]);
85798               utilGetSetValue(title, value);
85799           }
85800
85801           if (value) {
85802               syncTags.wikipedia = language()[2] + ':' + value;
85803           } else {
85804               syncTags.wikipedia = undefined;
85805               syncTags.wikidata = undefined;
85806           }
85807
85808           dispatch$1.call('change', this, syncTags);
85809
85810
85811           if (skipWikidata || !value || !language()[2]) return;
85812
85813           // attempt asynchronous update of wikidata tag..
85814           var initGraph = context.graph();
85815           var initEntityID = _entity.id;
85816
85817           wikidata.itemsByTitle(language()[2], value, function(err, data) {
85818               if (err) return;
85819
85820               // If graph has changed, we can't apply this update.
85821               if (context.graph() !== initGraph) return;
85822
85823               if (!data || !Object.keys(data).length) return;
85824
85825               var qids = Object.keys(data);
85826               var value = qids && find$1(qids, function(id) { return id.match(/^Q\d+$/); });
85827               var currTags = clone(context.entity(initEntityID).tags);
85828
85829               currTags.wikidata = value;
85830
85831               // Coalesce the update of wikidata tag into the previous tag change
85832               context.overwrite(
85833                   actionChangeTags(initEntityID, currTags),
85834                   context.history().undoAnnotation()
85835               );
85836
85837               // do not dispatch.call('change') here, because entity_editor
85838               // changeTags() is not intended to be called asynchronously
85839           });
85840       }
85841
85842
85843       wiki.tags = function(tags) {
85844           var value = tags[field.key] || '';
85845           var m = value.match(/([^:]+):([^#]+)(?:#(.+))?/);
85846           var l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; });
85847           var anchor = m && m[3];
85848
85849           // value in correct format
85850           if (l) {
85851               utilGetSetValue(lang, l[1]);
85852               utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
85853               if (anchor) {
85854                   try {
85855                       // Best-effort `anchorencode:` implementation
85856                       anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
85857                   } catch (e) {
85858                       anchor = anchor.replace(/ /g, '_');
85859                   }
85860               }
85861               _wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
85862                   m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
85863
85864           // unrecognized value format
85865           } else {
85866               utilGetSetValue(title, value);
85867               if (value && value !== '') {
85868                   utilGetSetValue(lang, '');
85869                   _wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
85870               } else {
85871                   _wikiURL = '';
85872               }
85873           }
85874       };
85875
85876
85877       wiki.entity = function(val) {
85878           if (!arguments.length) return _entity;
85879           _entity = val;
85880           return wiki;
85881       };
85882
85883
85884       wiki.focus = function() {
85885           title.node().focus();
85886       };
85887
85888
85889       return utilRebind(wiki, dispatch$1, 'on');
85890   }
85891
85892   var uiFields = {
85893       access: uiFieldAccess,
85894       address: uiFieldAddress,
85895       check: uiFieldCheck,
85896       combo: uiFieldCombo,
85897       cycleway: uiFieldCycleway,
85898       defaultCheck: uiFieldCheck,
85899       email: uiFieldText,
85900       lanes: uiFieldLanes,
85901       localized: uiFieldLocalized,
85902       maxspeed: uiFieldMaxspeed,
85903       multiCombo: uiFieldCombo,
85904       networkCombo: uiFieldCombo,
85905       number: uiFieldText,
85906       onewayCheck: uiFieldCheck,
85907       radio: uiFieldRadio,
85908       restrictions: uiFieldRestrictions,
85909       semiCombo: uiFieldCombo,
85910       structureRadio: uiFieldRadio,
85911       tel: uiFieldText,
85912       text: uiFieldText,
85913       textarea: uiFieldTextarea,
85914       typeCombo: uiFieldCombo,
85915       url: uiFieldText,
85916       wikidata: uiFieldWikidata,
85917       wikipedia: uiFieldWikipedia
85918   };
85919
85920   function uiField(context, presetField, entity, options) {
85921       options = assignIn({
85922           show: true,
85923           wrap: true,
85924           remove: true,
85925           revert: true,
85926           info: true
85927       }, options);
85928
85929       var dispatch$1 = dispatch('change');
85930       var field = clone(presetField);
85931       var _show = options.show;
85932       var _state = '';
85933       var _tags = {};
85934
85935       field.keys = field.keys || [field.key];
85936
85937       // only create the fields that are actually being shown
85938       if (_show && !field.impl) {
85939           createField();
85940       }
85941
85942       // Creates the field.. This is done lazily,
85943       // once we know that the field will be shown.
85944       function createField() {
85945           field.impl = uiFields[field.type](field, context)
85946               .on('change', function(t, onInput) {
85947                   dispatch$1.call('change', field, t, onInput);
85948               });
85949
85950           if (entity) {
85951               field.entityID = entity.id;
85952               // if this field cares about the entity, pass it along
85953               if (field.impl.entity) {
85954                   field.impl.entity(entity);
85955               }
85956           }
85957       }
85958
85959
85960       function isModified() {
85961           if (!entity) return false;
85962           var original = context.graph().base().entities[entity.id];
85963           return some(field.keys, function(key) {
85964               return original ? _tags[key] !== original.tags[key] : _tags[key];
85965           });
85966       }
85967
85968
85969       function isPresent() {
85970           return some(field.keys, function(key) {
85971               if (field.type === 'multiCombo') {
85972                   for (var tagKey in _tags) {
85973                       if (tagKey.indexOf(key) === 0) {
85974                           return true;
85975                       }
85976                   }
85977                   return false;
85978               }
85979               return _tags[key] !== undefined;
85980           });
85981       }
85982
85983
85984       function revert(d) {
85985           event.stopPropagation();
85986           event.preventDefault();
85987           if (!entity) return false;
85988
85989           var original = context.graph().base().entities[entity.id];
85990           var t = {};
85991           d.keys.forEach(function(key) {
85992               t[key] = original ? original.tags[key] : undefined;
85993           });
85994
85995           dispatch$1.call('change', d, t);
85996       }
85997
85998
85999       function remove(d) {
86000           event.stopPropagation();
86001           event.preventDefault();
86002
86003           var t = {};
86004           d.keys.forEach(function(key) {
86005               t[key] = undefined;
86006           });
86007
86008           dispatch$1.call('change', d, t);
86009       }
86010
86011
86012       field.render = function(selection) {
86013           var container = selection.selectAll('.form-field')
86014               .data([field]);
86015
86016           // Enter
86017           var enter = container.enter()
86018               .append('div')
86019               .attr('class', function(d) { return 'form-field form-field-' + d.safeid; })
86020               .classed('nowrap', !options.wrap);
86021
86022           if (options.wrap) {
86023               var label = enter
86024                   .append('label')
86025                   .attr('class', 'form-field-label')
86026                   .attr('for', function(d) { return 'preset-input-' + d.safeid; });
86027
86028               label
86029                   .append('span')
86030                   .attr('class', 'label-text')
86031                   .text(function(d) { return d.label(); });
86032
86033               if (options.remove) {
86034                   label
86035                       .append('button')
86036                       .attr('class', 'remove-icon')
86037                       .attr('title', t('icons.remove'))
86038                       .attr('tabindex', -1)
86039                       .call(svgIcon('#iD-operation-delete'));
86040               }
86041
86042               if (options.revert) {
86043                   label
86044                       .append('button')
86045                       .attr('class', 'modified-icon')
86046                       .attr('title', t('icons.undo'))
86047                       .attr('tabindex', -1)
86048                       .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-redo' : '#iD-icon-undo'));
86049               }
86050           }
86051
86052
86053           // Update
86054           container = container
86055               .merge(enter);
86056
86057           container.select('.form-field-label > .remove-icon')  // propagate bound data
86058               .on('click', remove);
86059
86060           container.select('.form-field-label > .modified-icon')  // propagate bound data
86061               .on('click', revert);
86062
86063           container
86064               .classed('modified', isModified())
86065               .classed('present', isPresent())
86066               .each(function(d) {
86067                   if (!d.impl) {
86068                       createField();
86069                   }
86070
86071                   var reference, help;
86072
86073                   // instantiate field help
86074                   if (options.wrap && field.type === 'restrictions') {
86075                       help = uiFieldHelp(context, 'restrictions');
86076                   }
86077
86078                   // instantiate tag reference
86079                   if (options.wrap && options.info) {
86080                       var referenceKey = d.key;
86081                       if (d.type === 'multiCombo') {   // lookup key without the trailing ':'
86082                           referenceKey = referenceKey.replace(/:$/, '');
86083                       }
86084
86085                       reference = uiTagReference(d.reference || { key: referenceKey }, context);
86086                       if (_state === 'hover') {
86087                           reference.showing(false);
86088                       }
86089                   }
86090
86091                   select(this)
86092                       .call(d.impl);
86093
86094                   // add field help components
86095                   if (help) {
86096                       select(this)
86097                           .call(help.body)
86098                           .select('.form-field-label')
86099                           .call(help.button);
86100                   }
86101
86102                   // add tag reference components
86103                   if (reference) {
86104                       select(this)
86105                           .call(reference.body)
86106                           .select('.form-field-label')
86107                           .call(reference.button);
86108                   }
86109
86110                   d.impl.tags(_tags);
86111               });
86112       };
86113
86114
86115       field.state = function(val) {
86116           if (!arguments.length) return _state;
86117           _state = val;
86118           return field;
86119       };
86120
86121
86122       field.tags = function(val) {
86123           if (!arguments.length) return _tags;
86124           _tags = val;
86125           return field;
86126       };
86127
86128
86129       field.show = function() {
86130           _show = true;
86131           if (!field.impl) {
86132               createField();
86133           }
86134           if (field.default && field.key && _tags[field.key] !== field.default) {
86135               var t = {};
86136               t[field.key] = field.default;
86137               dispatch$1.call('change', this, t);
86138           }
86139       };
86140
86141
86142       // A shown field has a visible UI, a non-shown field is in the 'Add field' dropdown
86143       field.isShown = function() {
86144           return _show || isPresent();
86145       };
86146
86147
86148       // An allowed field can appear in the UI or in the 'Add field' dropdown.
86149       // A non-allowed field is hidden from the user altogether
86150       field.isAllowed = function() {
86151           if (!entity || isPresent()) return true;   // a field with a value should always display
86152
86153           var latest = context.hasEntity(entity.id);   // check the most current copy of the entity
86154           if (!latest) return true;
86155
86156           var require = field.prerequisiteTag;
86157           if (require && require.key) {
86158               var value = latest.tags[require.key];
86159               if (!value) return false;
86160
86161               if (require.valueNot) {
86162                   return require.valueNot !== value;
86163               }
86164               if (require.value) {
86165                   return require.value === value;
86166               }
86167               return true;
86168           }
86169           return true;
86170       };
86171
86172
86173       field.focus = function() {
86174           if (field.impl) {
86175               field.impl.focus();
86176           }
86177       };
86178
86179
86180       return utilRebind(field, dispatch$1, 'on');
86181   }
86182
86183   function uiFormFields(context) {
86184       var moreCombo = uiCombobox(context, 'more-fields').minItems(1);
86185       var _fieldsArr = [];
86186       var _state = '';
86187       var _klass = '';
86188
86189
86190       function formFields(selection) {
86191           var allowedFields = _fieldsArr.filter(function(field) { return field.isAllowed(); });
86192           var shown = allowedFields.filter(function(field) { return field.isShown(); });
86193           var notShown = allowedFields.filter(function(field) { return !field.isShown(); });
86194
86195           var container = selection.selectAll('.form-fields-container')
86196               .data([0]);
86197
86198           container = container.enter()
86199               .append('div')
86200               .attr('class', 'form-fields-container ' + (_klass || ''))
86201               .merge(container);
86202
86203
86204           var fields = container.selectAll('.wrap-form-field')
86205               .data(shown, function(d) { return d.id + (d.entityID || ''); });
86206
86207           fields.exit()
86208               .remove();
86209
86210           // Enter
86211           var enter = fields.enter()
86212               .append('div')
86213               .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.safeid; });
86214
86215           // Update
86216           fields = fields
86217               .merge(enter);
86218
86219           fields
86220               .order()
86221               .each(function(d) {
86222                   select(this)
86223                       .call(d.render);
86224               });
86225
86226
86227           notShown = notShown.map(function(field) {
86228               return {
86229                   title: field.label(),
86230                   value: field.label(),
86231                   field: field
86232               };
86233           });
86234
86235
86236           var more = selection.selectAll('.more-fields')
86237               .data((_state === 'hover' || notShown.length === 0) ? [] : [0]);
86238
86239           more.exit()
86240               .remove();
86241
86242           more = more.enter()
86243               .append('div')
86244               .attr('class', 'more-fields')
86245               .append('label')
86246               .text(t('inspector.add_fields'))
86247               .merge(more);
86248
86249
86250           var input = more.selectAll('.value')
86251               .data([0]);
86252
86253           input.exit()
86254               .remove();
86255
86256           input = input.enter()
86257               .append('input')
86258               .attr('class', 'value')
86259               .attr('type', 'text')
86260               .call(utilNoAuto)
86261               .merge(input);
86262
86263           input
86264               .call(utilGetSetValue, '')
86265               .attr('placeholder', function() {
86266                   var placeholder = [];
86267                   for (var field in notShown) {
86268                       placeholder.push(notShown[field].title);
86269                   }
86270                   return placeholder.slice(0,3).join(', ') + ((placeholder.length > 3) ? '…' : '');
86271               })
86272               .call(moreCombo
86273                   .data(notShown)
86274                   .on('accept', function (d) {
86275                       if (!d) return;  // user entered something that was not matched
86276                       var field = d.field;
86277                       field.show();
86278                       selection.call(formFields);  // rerender
86279                       if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
86280                           field.focus();
86281                       }
86282                   })
86283               );
86284       }
86285
86286
86287       formFields.fieldsArr = function(val) {
86288           if (!arguments.length) return _fieldsArr;
86289           _fieldsArr = val || [];
86290           return formFields;
86291       };
86292
86293       formFields.state = function(val) {
86294           if (!arguments.length) return _state;
86295           _state = val;
86296           return formFields;
86297       };
86298
86299       formFields.klass = function(val) {
86300           if (!arguments.length) return _klass;
86301           _klass = val;
86302           return formFields;
86303       };
86304
86305
86306       return formFields;
86307   }
86308
86309   function uiPresetEditor(context) {
86310       var dispatch$1 = dispatch('change');
86311       var formFields = uiFormFields(context);
86312       var _state;
86313       var _fieldsArr;
86314       var _preset;
86315       var _tags;
86316       var _entityID;
86317
86318
86319       function presetEditor(selection) {
86320           selection.call(uiDisclosure(context, 'preset_fields', true)
86321               .title(t('inspector.all_fields'))
86322               .content(render)
86323           );
86324       }
86325
86326
86327       function render(selection) {
86328           if (!_fieldsArr) {
86329               var entity = context.entity(_entityID);
86330               var geometry = context.geometry(_entityID);
86331               var presets = context.presets();
86332
86333               _fieldsArr = [];
86334
86335               _preset.fields.forEach(function(field) {
86336                   if (field.matchGeometry(geometry)) {
86337                       _fieldsArr.push(
86338                           uiField(context, field, entity)
86339                       );
86340                   }
86341               });
86342
86343               if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
86344                   _fieldsArr.push(
86345                       uiField(context, presets.field('restrictions'), entity)
86346                   );
86347               }
86348
86349               var additionalFields = union(_preset.moreFields, presets.universal());
86350               additionalFields.sort(function(field1, field2) {
86351                   return field1.label() > field2.label();
86352               });
86353
86354               additionalFields.forEach(function(field) {
86355                   if (_preset.fields.indexOf(field) === -1) {
86356                       _fieldsArr.push(
86357                           uiField(context, field, entity, { show: false })
86358                       );
86359                   }
86360               });
86361
86362               _fieldsArr.forEach(function(field) {
86363                   field
86364                       .on('change', function(t, onInput) {
86365                           dispatch$1.call('change', field, t, onInput);
86366                       });
86367               });
86368           }
86369
86370           _fieldsArr.forEach(function(field) {
86371               field
86372                   .state(_state)
86373                   .tags(_tags);
86374           });
86375
86376
86377           selection
86378               .call(formFields
86379                   .fieldsArr(_fieldsArr)
86380                   .state(_state)
86381                   .klass('inspector-inner fillL3')
86382               );
86383
86384
86385           selection.selectAll('.wrap-form-field input')
86386               .on('keydown', function() {
86387                   // if user presses enter, and combobox is not active, accept edits..
86388                   if (event.keyCode === 13 && select('.combobox').empty()) {
86389                       context.enter(modeBrowse(context));
86390                   }
86391               });
86392       }
86393
86394
86395       presetEditor.preset = function(val) {
86396           if (!arguments.length) return _preset;
86397           if (_preset && _preset.id === val.id) return presetEditor;
86398           _preset = val;
86399           _fieldsArr = null;
86400           return presetEditor;
86401       };
86402
86403
86404       presetEditor.state = function(val) {
86405           if (!arguments.length) return _state;
86406           _state = val;
86407           return presetEditor;
86408       };
86409
86410
86411       presetEditor.tags = function(val) {
86412           if (!arguments.length) return _tags;
86413           _tags = val;
86414           // Don't reset _fieldsArr here.
86415           return presetEditor;
86416       };
86417
86418
86419       presetEditor.entityID = function(val) {
86420           if (!arguments.length) return _entityID;
86421           if (_entityID === val) return presetEditor;
86422           _entityID = val;
86423           _fieldsArr = null;
86424           return presetEditor;
86425       };
86426
86427
86428       return utilRebind(presetEditor, dispatch$1, 'on');
86429   }
86430
86431   function uiEntityIssues(context) {
86432       var _selection = select(null);
86433       var _expandedIssueID;
86434       var _entityID;
86435
86436       // Listen for validation reload even though the entity editor is reloaded on
86437       // every graph change since the graph change event may happen before the issue
86438       // cache is refreshed
86439       context.validator().on('reload.entity_issues', function() {
86440
86441            _selection.selectAll('.disclosure-wrap-entity_issues')
86442                .call(render);
86443
86444           update();
86445       });
86446
86447
86448       function entityIssues(selection) {
86449           _selection = selection;
86450
86451           selection
86452               .call(uiDisclosure(context, 'entity_issues', true)
86453                   .content(render)
86454               );
86455
86456           update();
86457       }
86458
86459
86460       function update() {
86461           var issues = context.validator().getIssuesForEntityWithID(_entityID);
86462
86463           _selection
86464               .classed('hide', issues.length === 0);
86465
86466           _selection.selectAll('.hide-toggle-entity_issues span')
86467               .text(t('issues.list_title', { count: issues.length }));
86468       }
86469
86470
86471       function render(selection) {
86472           var issues = context.validator().getIssuesForEntityWithID(_entityID);
86473           _expandedIssueID = issues.length > 0 ? issues[0].id() : null;
86474
86475           var items = selection.selectAll('.issue')
86476               .data(issues, function(d) { return d.id(); });
86477
86478           // Exit
86479           items.exit()
86480               .remove();
86481
86482           // Enter
86483           var itemsEnter = items.enter()
86484               .append('div')
86485               .attr('class', function(d) { return 'issue severity-' + d.severity; })
86486               .call(tooltip()
86487                   .html(true)
86488                   .title(function(d) { return uiTooltipHtml(d.tooltip); })
86489                   .placement('top')
86490               )
86491               .on('mouseover.highlight', function(d) {
86492                   // don't hover-highlight the selected entity
86493                   var ids = d.entities.filter(function(e) { return e.id !== _entityID; })
86494                       .map(function(e) { return e.id; });
86495                   utilHighlightEntities(ids, true, context);
86496               })
86497               .on('mouseout.highlight', function(d) {
86498                   var ids = d.entities.filter(function(e) { return e.id !== _entityID; })
86499                       .map(function(e) { return e.id; });
86500                   utilHighlightEntities(ids, false, context);
86501               });
86502
86503           var messagesEnter = itemsEnter
86504               .append('button')
86505               .attr('class', 'message')
86506               .on('click', function(d) {
86507
86508                   _expandedIssueID = d.id();   // expand only the clicked item
86509                   selection.selectAll('.issue')
86510                       .classed('expanded', function(d) { return d.id() === _expandedIssueID; });
86511
86512                   var extent = d.extent(context.graph());
86513                   if (extent) {
86514                       var view = context.map().trimmedExtent();
86515                       var zoom = context.map().zoom();
86516                       if (!view.contains(extent) || zoom < 19) {
86517                           context.map().centerZoomEase(extent.center(), Math.max(zoom, 19));
86518                       }
86519                   }
86520               });
86521
86522           messagesEnter
86523               .append('span')
86524               .attr('class', 'issue-icon')
86525               .call(svgIcon('', 'pre-text'));
86526
86527           messagesEnter
86528               .append('strong')
86529               .attr('class', 'issue-text');
86530
86531           itemsEnter
86532               .append('ul')
86533               .attr('class', 'issue-fix-list');
86534
86535
86536           // Update
86537           items = items
86538               .merge(itemsEnter)
86539               .classed('expanded', function(d) { return d.id() === _expandedIssueID; });
86540
86541           items.select('.issue-icon svg use')     // propagate bound data
86542               .attr('href', function(d) {
86543                   return '#iD-icon-' + (d.severity === 'warning' ? 'alert' : 'error');
86544               });
86545
86546           items.select('.issue-text')     // propagate bound data
86547               .text(function(d) { return d.message; });
86548
86549
86550           // fixes
86551           var fixLists = items.selectAll('.issue-fix-list');
86552
86553           var fixes = fixLists.selectAll('.issue-fix-item')
86554               .data(function(d) { return d.fixes; })
86555               .enter()
86556               .append('li')
86557               .attr('class', function(d) {
86558                   return 'issue-fix-item ' + (d.onClick ? 'actionable' : '');
86559               })
86560               .append('button')
86561               .on('click', function(d) {
86562                   if (d.onClick) {
86563                       utilHighlightEntities(d.entityIds, false, context);
86564                       d.onClick();
86565                   }
86566               })
86567               .on('mouseover.highlight', function(d) {
86568                   utilHighlightEntities(d.entityIds, true, context);
86569               })
86570               .on('mouseout.highlight', function(d) {
86571                   utilHighlightEntities(d.entityIds, false, context);
86572               });
86573
86574           fixes.append('span')
86575               .attr('class', 'fix-icon')
86576               .each(function(d) {
86577                   var iconName = d.icon || 'iD-icon-wrench';
86578                   if (iconName.startsWith('maki')) {
86579                       iconName += '-15';
86580                   }
86581                   select(this).call(svgIcon('#' + iconName, 'pre-text'));
86582               });
86583
86584           fixes.append('span')
86585               .text(function(d) { return d.title; });
86586       }
86587
86588
86589       entityIssues.entityID = function(val) {
86590           if (!arguments.length) return _entityID;
86591           if (_entityID !== val) {
86592               _entityID = val;
86593               _expandedIssueID = null;
86594           }
86595           return entityIssues;
86596       };
86597
86598
86599       return entityIssues;
86600   }
86601
86602   function uiEntityEditor(context) {
86603       var dispatch$1 = dispatch('choose');
86604       var _state = 'select';
86605       var _coalesceChanges = false;
86606       var _modified = false;
86607       var _base;
86608       var _entityID;
86609       var _activePreset;
86610       var _tagReference;
86611
86612       var entityIssues = uiEntityIssues(context);
86613       var quickLinks = uiQuickLinks();
86614       var presetEditor = uiPresetEditor(context).on('change', changeTags);
86615       var rawTagEditor = uiRawTagEditor(context).on('change', changeTags);
86616       var rawMemberEditor = uiRawMemberEditor(context);
86617       var rawMembershipEditor = uiRawMembershipEditor(context);
86618
86619       function entityEditor(selection) {
86620           var entity = context.entity(_entityID);
86621           var tags = clone(entity.tags);
86622
86623           // Header
86624           var header = selection.selectAll('.header')
86625               .data([0]);
86626
86627           // Enter
86628           var headerEnter = header.enter()
86629               .append('div')
86630               .attr('class', 'header fillL cf');
86631
86632           headerEnter
86633               .append('button')
86634               .attr('class', 'fl preset-reset preset-choose')
86635               .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-forward' : '#iD-icon-backward'));
86636
86637           headerEnter
86638               .append('button')
86639               .attr('class', 'fr preset-close')
86640               .on('click', function() { context.enter(modeBrowse(context)); })
86641               .call(svgIcon(_modified ? '#iD-icon-apply' : '#iD-icon-close'));
86642
86643           headerEnter
86644               .append('h3')
86645               .text(t('inspector.edit'));
86646
86647           // Update
86648           header = header
86649               .merge(headerEnter);
86650
86651           header.selectAll('.preset-reset')
86652               .on('click', function() {
86653                   dispatch$1.call('choose', this, _activePreset);
86654               });
86655
86656
86657           // Body
86658           var body = selection.selectAll('.inspector-body')
86659               .data([0]);
86660
86661           // Enter
86662           var bodyEnter = body.enter()
86663               .append('div')
86664               .attr('class', 'inspector-body');
86665
86666           bodyEnter
86667               .append('div')
86668               .attr('class', 'preset-list-item inspector-inner')
86669               .append('div')
86670               .attr('class', 'preset-list-button-wrap')
86671               .append('button')
86672               .attr('class', 'preset-list-button preset-reset')
86673               .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
86674               .append('div')
86675               .attr('class', 'label')
86676               .append('div')
86677               .attr('class', 'label-inner');
86678
86679           bodyEnter
86680               .append('div')
86681               .attr('class', 'preset-quick-links');
86682
86683           bodyEnter
86684               .append('div')
86685               .attr('class', 'entity-issues');
86686
86687           bodyEnter
86688               .append('div')
86689               .attr('class', 'preset-editor');
86690
86691           bodyEnter
86692               .append('div')
86693               .attr('class', 'raw-tag-editor inspector-inner');
86694
86695           bodyEnter
86696               .append('div')
86697               .attr('class', 'raw-member-editor inspector-inner');
86698
86699           bodyEnter
86700               .append('div')
86701               .attr('class', 'raw-membership-editor inspector-inner');
86702
86703           bodyEnter
86704               .append('input')
86705               .attr('type', 'text')
86706               .attr('class', 'key-trap');
86707
86708
86709           // Update
86710           body = body
86711               .merge(bodyEnter);
86712
86713           // update header
86714           if (_tagReference) {
86715               body.selectAll('.preset-list-button-wrap')
86716                   .call(_tagReference.button);
86717
86718               body.selectAll('.preset-list-item')
86719                   .call(_tagReference.body);
86720           }
86721
86722           body.selectAll('.preset-reset')
86723               .on('click', function() {
86724                   dispatch$1.call('choose', this, _activePreset);
86725               });
86726
86727           body.select('.preset-list-item button')
86728               .call(uiPresetIcon()
86729                   .geometry(context.geometry(_entityID))
86730                   .preset(_activePreset)
86731               );
86732
86733           // NOTE: split on en-dash, not a hypen (to avoid conflict with hyphenated names)
86734           var label = body.select('.label-inner');
86735           var nameparts = label.selectAll('.namepart')
86736               .data(_activePreset.name().split(' – '), function(d) { return d; });
86737
86738           nameparts.exit()
86739               .remove();
86740
86741           nameparts
86742               .enter()
86743               .append('div')
86744               .attr('class', 'namepart')
86745               .text(function(d) { return d; });
86746
86747           // update quick links
86748           var choices = [{
86749               id: 'zoom_to',
86750               label: 'inspector.zoom_to.title',
86751               tooltip: function() {
86752                   return uiTooltipHtml(t('inspector.zoom_to.tooltip_feature'), t('inspector.zoom_to.key'));
86753               },
86754               click: function zoomTo() {
86755                   context.mode().zoomToSelected();
86756               }
86757           }];
86758
86759           body.select('.preset-quick-links')
86760               .call(quickLinks.choices(choices));
86761
86762
86763           // update editor sections
86764           body.select('.entity-issues')
86765               .call(entityIssues
86766                   .entityID(_entityID)
86767               );
86768
86769           body.select('.preset-editor')
86770               .call(presetEditor
86771                   .preset(_activePreset)
86772                   .entityID(_entityID)
86773                   .tags(tags)
86774                   .state(_state)
86775               );
86776
86777           body.select('.raw-tag-editor')
86778               .call(rawTagEditor
86779                   .preset(_activePreset)
86780                   .entityID(_entityID)
86781                   .tags(tags)
86782                   .state(_state)
86783               );
86784
86785           if (entity.type === 'relation') {
86786               body.select('.raw-member-editor')
86787                   .style('display', 'block')
86788                   .call(rawMemberEditor
86789                       .entityID(_entityID)
86790                   );
86791           } else {
86792               body.select('.raw-member-editor')
86793                   .style('display', 'none');
86794           }
86795
86796           body.select('.raw-membership-editor')
86797               .call(rawMembershipEditor
86798                   .entityID(_entityID)
86799               );
86800
86801           body.select('.key-trap')
86802               .on('keydown.key-trap', function() {
86803                   // On tabbing, send focus back to the first field on the inspector-body
86804                   // (probably the `name` field) #4159
86805                   if (event.keyCode === 9 && !event.shiftKey) {
86806                       event.preventDefault();
86807                       body.select('input').node().focus();
86808                   }
86809               });
86810
86811           context.history()
86812               .on('change.entity-editor', historyChanged);
86813
86814
86815           function historyChanged() {
86816               if (_state === 'hide') return;
86817
86818               var entity = context.hasEntity(_entityID);
86819               var graph = context.graph();
86820               if (!entity) return;
86821
86822               var match = context.presets().match(entity, graph);
86823               var activePreset = entityEditor.preset();
86824               var weakPreset = activePreset && isEmpty(activePreset.addTags);
86825
86826               // A "weak" preset doesn't set any tags. (e.g. "Address")
86827               // Don't replace a weak preset with a fallback preset (e.g. "Point")
86828               if (!(weakPreset && match.isFallback())) {
86829                   entityEditor.preset(match);
86830               }
86831               entityEditor.modified(_base !== graph);
86832               entityEditor(selection);
86833           }
86834       }
86835
86836
86837       // Tag changes that fire on input can all get coalesced into a single
86838       // history operation when the user leaves the field.  #2342
86839       function changeTags(changed, onInput) {
86840           var entity = context.entity(_entityID);
86841           var annotation = t('operations.change_tags.annotation');
86842           var tags = clone(entity.tags);
86843
86844           for (var k in changed) {
86845               if (!k) continue;
86846               var v = changed[k];
86847               if (v !== undefined || tags.hasOwnProperty(k)) {
86848                   tags[k] = v;
86849               }
86850           }
86851
86852           if (!onInput) {
86853               tags = utilCleanTags(tags);
86854           }
86855
86856           if (!isEqual(entity.tags, tags)) {
86857               if (_coalesceChanges) {
86858                   context.overwrite(actionChangeTags(_entityID, tags), annotation);
86859               } else {
86860                   context.perform(actionChangeTags(_entityID, tags), annotation);
86861                   _coalesceChanges = !!onInput;
86862               }
86863           }
86864       }
86865
86866
86867       entityEditor.modified = function(val) {
86868           if (!arguments.length) return _modified;
86869           _modified = val;
86870           d3_selectAll('button.preset-close use')
86871               .attr('xlink:href', (_modified ? '#iD-icon-apply' : '#iD-icon-close'));
86872           return entityEditor;
86873       };
86874
86875
86876       entityEditor.state = function(val) {
86877           if (!arguments.length) return _state;
86878           _state = val;
86879           return entityEditor;
86880       };
86881
86882
86883       entityEditor.entityID = function(val) {
86884           if (!arguments.length) return _entityID;
86885           _entityID = val;
86886           _base = context.graph();
86887           _coalesceChanges = false;
86888
86889           // reset the scroll to the top of the inspector
86890           var body = d3_selectAll('.entity-editor-pane .inspector-body');
86891           if (!body.empty()) {
86892               body.node().scrollTop = 0;
86893           }
86894
86895           var presetMatch = context.presets().match(context.entity(_entityID), _base);
86896
86897           return entityEditor
86898               .preset(presetMatch)
86899               .modified(false);
86900       };
86901
86902
86903       entityEditor.preset = function(val) {
86904           if (!arguments.length) return _activePreset;
86905           if (val !== _activePreset) {
86906               _activePreset = val;
86907               _tagReference = uiTagReference(_activePreset.reference(context.geometry(_entityID)), context)
86908                   .showing(false);
86909           }
86910           return entityEditor;
86911       };
86912
86913
86914       return utilRebind(entityEditor, dispatch$1, 'on');
86915   }
86916
86917   var pair_1 = pair$1;
86918
86919   function search(x, dims, r) {
86920     if (!dims) dims = 'NSEW';
86921     if (typeof x !== 'string') return { val: null, regex: r };
86922
86923     r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
86924
86925     var m = r.exec(x);
86926     if (!m) return { val: null, regex: r };
86927
86928     var dim = m[1] || m[5];
86929     if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
86930
86931     return {
86932       val: (((m[2]) ? parseFloat(m[2]) : 0) +
86933             ((m[3] ? parseFloat(m[3]) / 60 : 0)) +
86934             ((m[4] ? parseFloat(m[4]) / 3600 : 0))) *
86935             ((dim === 'S' || dim === 'W') ? -1 : 1),
86936       regex: r,
86937       raw: m[0],
86938       dim: dim
86939     };
86940   }
86941
86942   function pair$1(x, dims) {
86943     x = x.trim();
86944     var one = search(x, dims);
86945     if (one.val === null) return null;
86946     var two = search(x, dims, one.regex);
86947     if (two.val === null) return null;
86948     // null if one/two are not contiguous.
86949     if (one.raw + two.raw !== x) return null;
86950     if (one.dim) {
86951       return swapdim(one.val, two.val, one.dim);
86952     } else {
86953       return [one.val, two.val];
86954     }
86955   }
86956
86957   function swapdim(a, b, dim) {
86958     if (dim === 'N' || dim === 'S') return [a, b];
86959     if (dim === 'W' || dim === 'E') return [b, a];
86960   }
86961
86962   function uiFeatureList(context) {
86963       var _geocodeResults;
86964
86965
86966       function featureList(selection) {
86967           var header = selection
86968               .append('div')
86969               .attr('class', 'header fillL cf');
86970
86971           header
86972               .append('h3')
86973               .text(t('inspector.feature_list'));
86974
86975           var searchWrap = selection
86976               .append('div')
86977               .attr('class', 'search-header');
86978
86979           var search = searchWrap
86980               .append('input')
86981               .attr('placeholder', t('inspector.search'))
86982               .attr('type', 'search')
86983               .call(utilNoAuto)
86984               .on('keypress', keypress)
86985               .on('keydown', keydown)
86986               .on('input', inputevent);
86987
86988           searchWrap
86989               .call(svgIcon('#iD-icon-search', 'pre-text'));
86990
86991           var listWrap = selection
86992               .append('div')
86993               .attr('class', 'inspector-body');
86994
86995           var list = listWrap
86996               .append('div')
86997               .attr('class', 'feature-list cf');
86998
86999           context
87000               .on('exit.feature-list', clearSearch);
87001           context.map()
87002               .on('drawn.feature-list', mapDrawn);
87003
87004           context.keybinding()
87005               .on(uiCmd('⌘F'), focusSearch);
87006
87007
87008           function focusSearch() {
87009               var mode = context.mode() && context.mode().id;
87010               if (mode !== 'browse') return;
87011
87012               event.preventDefault();
87013               search.node().focus();
87014           }
87015
87016
87017           function keydown() {
87018               if (event.keyCode === 27) {  // escape
87019                   search.node().blur();
87020               }
87021           }
87022
87023
87024           function keypress() {
87025               var q = search.property('value'),
87026                   items = list.selectAll('.feature-list-item');
87027               if (event.keyCode === 13 && q.length && items.size()) {  // return
87028                   click(items.datum());
87029               }
87030           }
87031
87032
87033           function inputevent() {
87034               _geocodeResults = undefined;
87035               drawList();
87036           }
87037
87038
87039           function clearSearch() {
87040               search.property('value', '');
87041               drawList();
87042           }
87043
87044
87045           function mapDrawn(e) {
87046               if (e.full) {
87047                   drawList();
87048               }
87049           }
87050
87051
87052           function features() {
87053               var entities = {};
87054               var result = [];
87055               var graph = context.graph();
87056               var q = search.property('value').toLowerCase();
87057
87058               if (!q) return result;
87059
87060               var idMatch = q.match(/^([nwr])([0-9]+)$/);
87061
87062               if (idMatch) {
87063                   result.push({
87064                       id: idMatch[0],
87065                       geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
87066                       type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
87067                       name: idMatch[2]
87068                   });
87069               }
87070
87071               var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
87072
87073               if (locationMatch) {
87074                   var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
87075                   result.push({
87076                       id: -1,
87077                       geometry: 'point',
87078                       type: t('inspector.location'),
87079                       name: dmsCoordinatePair([loc[1], loc[0]]),
87080                       location: loc
87081                   });
87082               }
87083
87084               function addEntity(entity) {
87085                   if (entity.id in entities || result.length > 200)
87086                       return;
87087
87088                   entities[entity.id] = true;
87089
87090                   var name = utilDisplayName(entity) || '';
87091                   if (name.toLowerCase().indexOf(q) >= 0) {
87092                       var matched = context.presets().match(entity, graph);
87093                       var type = (matched && matched.name()) || utilDisplayType(entity.id);
87094
87095                       result.push({
87096                           id: entity.id,
87097                           entity: entity,
87098                           geometry: context.geometry(entity.id),
87099                           type: type,
87100                           name: name
87101                       });
87102                   }
87103
87104                   graph.parentRelations(entity).forEach(function(parent) {
87105                       addEntity(parent);
87106                   });
87107               }
87108
87109               var visible = context.surface().selectAll('.point, .line, .area').nodes();
87110               for (var i = 0; i < visible.length && result.length <= 200; i++) {
87111                   var datum = visible[i].__data__;
87112                   var entity = datum && datum.properties && datum.properties.entity;
87113                   if (entity) { addEntity(entity); }
87114               }
87115
87116               (_geocodeResults || []).forEach(function(d) {
87117                   if (d.osm_type && d.osm_id) {    // some results may be missing these - #1890
87118
87119                       // Make a temporary osmEntity so we can preset match
87120                       // and better localize the search result - #4725
87121                       var id = osmEntity.id.fromOSM(d.osm_type, d.osm_id);
87122                       var tags = {};
87123                       tags[d.class] = d.type;
87124
87125                       var attrs = { id: id, type: d.osm_type, tags: tags };
87126                       if (d.osm_type === 'way') {   // for ways, add some fake closed nodes
87127                           attrs.nodes = ['a','a'];  // so that geometry area is possible
87128                       }
87129
87130                       var tempEntity = osmEntity(attrs);
87131                       var tempGraph = coreGraph([tempEntity]);
87132                       var matched = context.presets().match(tempEntity, tempGraph);
87133                       var type = (matched && matched.name()) || utilDisplayType(id);
87134
87135                       result.push({
87136                           id: tempEntity.id,
87137                           geometry: tempEntity.geometry(tempGraph),
87138                           type: type,
87139                           name: d.display_name,
87140                           extent: new geoExtent(
87141                               [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
87142                               [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
87143                       });
87144                   }
87145               });
87146
87147               return result;
87148           }
87149
87150
87151           function drawList() {
87152               var value = search.property('value');
87153               var results = features();
87154
87155               list.classed('filtered', value.length);
87156
87157               var noResultsWorldwide = _geocodeResults && _geocodeResults.length === 0;
87158
87159               var resultsIndicator = list.selectAll('.no-results-item')
87160                   .data([0])
87161                   .enter()
87162                   .append('button')
87163                   .property('disabled', true)
87164                   .attr('class', 'no-results-item')
87165                   .call(svgIcon('#iD-icon-alert', 'pre-text'));
87166
87167               resultsIndicator.append('span')
87168                   .attr('class', 'entity-name');
87169
87170               list.selectAll('.no-results-item .entity-name')
87171                   .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
87172
87173               if (services.geocoder) {
87174                 list.selectAll('.geocode-item')
87175                     .data([0])
87176                     .enter()
87177                     .append('button')
87178                     .attr('class', 'geocode-item')
87179                     .on('click', geocoderSearch)
87180                     .append('div')
87181                     .attr('class', 'label')
87182                     .append('span')
87183                     .attr('class', 'entity-name')
87184                     .text(t('geocoder.search'));
87185               }
87186
87187               list.selectAll('.no-results-item')
87188                   .style('display', (value.length && !results.length) ? 'block' : 'none');
87189
87190               list.selectAll('.geocode-item')
87191                   .style('display', (value && _geocodeResults === undefined) ? 'block' : 'none');
87192
87193               list.selectAll('.feature-list-item')
87194                   .data([-1])
87195                   .remove();
87196
87197               var items = list.selectAll('.feature-list-item')
87198                   .data(results, function(d) { return d.id; });
87199
87200               var enter = items.enter()
87201                   .insert('button', '.geocode-item')
87202                   .attr('class', 'feature-list-item')
87203                   .on('mouseover', mouseover)
87204                   .on('mouseout', mouseout)
87205                   .on('click', click);
87206
87207               var label = enter
87208                   .append('div')
87209                   .attr('class', 'label');
87210
87211               label
87212                   .each(function(d) {
87213                       select(this)
87214                           .call(svgIcon('#iD-icon-' + d.geometry, 'pre-text'));
87215                   });
87216
87217               label
87218                   .append('span')
87219                   .attr('class', 'entity-type')
87220                   .text(function(d) { return d.type; });
87221
87222               label
87223                   .append('span')
87224                   .attr('class', 'entity-name')
87225                   .text(function(d) { return d.name; });
87226
87227               enter
87228                   .style('opacity', 0)
87229                   .transition()
87230                   .style('opacity', 1);
87231
87232               items.order();
87233
87234               items.exit()
87235                   .remove();
87236           }
87237
87238
87239           function mouseover(d) {
87240               if (d.id === -1) return;
87241
87242               context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
87243                   .classed('hover', true);
87244           }
87245
87246
87247           function mouseout() {
87248               context.surface().selectAll('.hover')
87249                   .classed('hover', false);
87250           }
87251
87252
87253           function click(d) {
87254               event.preventDefault();
87255               if (d.location) {
87256                   context.map().centerZoomEase([d.location[1], d.location[0]], 19);
87257               }
87258               else if (d.entity) {
87259                   if (d.entity.type === 'node') {
87260                       context.map().center(d.entity.loc);
87261                   } else if (d.entity.type === 'way') {
87262                       var center = context.projection(context.map().center());
87263                       var edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
87264                       context.map().center(edge.loc);
87265                   }
87266                   context.enter(modeSelect(context, [d.entity.id]));
87267               } else {
87268                   context.zoomToEntity(d.id);
87269               }
87270           }
87271
87272
87273           function geocoderSearch() {
87274               services.geocoder.search(search.property('value'), function (err, resp) {
87275                   _geocodeResults = resp || [];
87276                   drawList();
87277               });
87278           }
87279       }
87280
87281
87282       return featureList;
87283   }
87284
87285   var _flashTimer;
87286
87287
87288   function uiFlash() {
87289       var _duration = 2000;
87290       var _iconName = '#iD-icon-no';
87291       var _iconClass = 'disabled';
87292       var _text = '';
87293       var _textClass;
87294
87295
87296       function flash() {
87297           if (_flashTimer) {
87298               _flashTimer.stop();
87299           }
87300
87301           select('#footer-wrap')
87302               .attr('class', 'footer-hide');
87303           select('#flash-wrap')
87304               .attr('class', 'footer-show');
87305
87306           var content = select('#flash-wrap').selectAll('.flash-content')
87307               .data([0]);
87308
87309           // Enter
87310           var contentEnter = content.enter()
87311               .append('div')
87312               .attr('class', 'flash-content');
87313
87314           var iconEnter = contentEnter
87315               .append('svg')
87316               .attr('class', 'flash-icon')
87317               .append('g')
87318               .attr('transform', 'translate(10,10)');
87319
87320           iconEnter
87321               .append('circle')
87322               .attr('r', 9);
87323
87324           iconEnter
87325               .append('use')
87326               .attr('transform', 'translate(-7,-7)')
87327               .attr('width', '14')
87328               .attr('height', '14');
87329
87330           contentEnter
87331               .append('div')
87332               .attr('class', 'flash-text');
87333
87334
87335           // Update
87336           content = content
87337               .merge(contentEnter);
87338
87339           content
87340               .selectAll('.flash-icon')
87341               .attr('class', 'flash-icon ' + (_iconClass || ''));
87342
87343           content
87344               .selectAll('.flash-icon use')
87345               .attr('xlink:href', _iconName);
87346
87347           content
87348               .selectAll('.flash-text')
87349               .attr('class', 'flash-text ' + (_textClass || ''))
87350               .text(_text);
87351
87352
87353           _flashTimer = timeout$1(function() {
87354               _flashTimer = null;
87355               select('#footer-wrap')
87356                   .attr('class', 'footer-show');
87357               select('#flash-wrap')
87358                   .attr('class', 'footer-hide');
87359           }, _duration);
87360
87361           return content;
87362       }
87363
87364
87365       flash.duration = function(_) {
87366           if (!arguments.length) return _duration;
87367           _duration = _;
87368           return flash;
87369       };
87370
87371       flash.text = function(_) {
87372           if (!arguments.length) return _text;
87373           _text = _;
87374           return flash;
87375       };
87376
87377       flash.textClass = function(_) {
87378           if (!arguments.length) return _textClass;
87379           _textClass = _;
87380           return flash;
87381       };
87382
87383       flash.iconName = function(_) {
87384           if (!arguments.length) return _iconName;
87385           _iconName = _;
87386           return flash;
87387       };
87388
87389       flash.iconClass = function(_) {
87390           if (!arguments.length) return _iconClass;
87391           _iconClass = _;
87392           return flash;
87393       };
87394
87395       return flash;
87396   }
87397
87398   function uiImproveOsmComments() {
87399       var _error;
87400
87401
87402       function errorComments(selection) {
87403           // make the div immediately so it appears above the buttons
87404           var comments = selection.selectAll('.comments-container')
87405               .data([0]);
87406
87407           comments = comments.enter()
87408               .append('div')
87409               .attr('class', 'comments-container')
87410               .merge(comments);
87411
87412           // must retrieve comments from API before they can be displayed
87413           services.improveOSM.getComments(_error, function(err, d) {
87414               if (!d.comments) { return; } // nothing to do here
87415
87416               var commentEnter = comments.selectAll('.comment')
87417                   .data(d.comments)
87418                   .enter()
87419                   .append('div')
87420                   .attr('class', 'comment');
87421
87422               commentEnter
87423                   .append('div')
87424                   .attr('class', 'comment-avatar')
87425                   .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
87426
87427               var mainEnter = commentEnter
87428                   .append('div')
87429                   .attr('class', 'comment-main');
87430
87431               var metadataEnter = mainEnter
87432                   .append('div')
87433                   .attr('class', 'comment-metadata');
87434
87435               metadataEnter
87436                   .append('div')
87437                   .attr('class', 'comment-author')
87438                   .each(function(d) {
87439                       var selection = select(this);
87440                       var osm = services.osm;
87441                       if (osm && d.username) {
87442                           selection = selection
87443                               .append('a')
87444                               .attr('class', 'comment-author-link')
87445                               .attr('href', osm.userURL(d.username))
87446                               .attr('tabindex', -1)
87447                               .attr('target', '_blank');
87448                       }
87449                       selection
87450                           .text(function(d) { return d.username; });
87451                   });
87452
87453               metadataEnter
87454                   .append('div')
87455                   .attr('class', 'comment-date')
87456                   .text(function(d) {
87457                       return t('note.status.commented', { when: localeDateString(d.timestamp) });
87458                   });
87459
87460               mainEnter
87461                   .append('div')
87462                   .attr('class', 'comment-text')
87463                   .append('p')
87464                   .text(function(d) { return d.text; });
87465           });
87466       }
87467
87468       function localeDateString(s) {
87469           if (!s) return null;
87470           var detected = utilDetect();
87471           var options = { day: 'numeric', month: 'short', year: 'numeric' };
87472           var d = new Date(s * 1000); // timestamp is served in seconds, date takes ms
87473           if (isNaN(d.getTime())) return null;
87474           return d.toLocaleDateString(detected.locale, options);
87475       }
87476
87477       errorComments.error = function(val) {
87478           if (!arguments.length) return _error;
87479           _error = val;
87480           return errorComments;
87481       };
87482
87483       return errorComments;
87484   }
87485
87486   function uiImproveOsmDetails(context) {
87487       var _error;
87488
87489
87490       function errorDetail(d) {
87491           var unknown = t('inspector.unknown');
87492
87493           if (!d) return unknown;
87494
87495           if (d.desc) return d.desc;
87496
87497           var errorType = d.error_key;
87498           var et = en.QA.improveOSM.error_types[errorType];
87499
87500           var detail;
87501           if (et && et.description) {
87502               detail = t('QA.improveOSM.error_types.' + errorType + '.description', d.replacements);
87503           } else {
87504               detail = unknown;
87505           }
87506
87507           return detail;
87508       }
87509
87510
87511       function improveOsmDetails(selection) {
87512           var details = selection.selectAll('.error-details')
87513               .data(
87514                   (_error ? [_error] : []),
87515                   function(d) { return d.id + '-' + (d.status || 0); }
87516               );
87517
87518           details.exit()
87519               .remove();
87520
87521           var detailsEnter = details.enter()
87522               .append('div')
87523               .attr('class', 'error-details error-details-container');
87524
87525
87526           // description
87527           var descriptionEnter = detailsEnter
87528               .append('div')
87529               .attr('class', 'error-details-description');
87530
87531           descriptionEnter
87532               .append('h4')
87533               .text(function() { return t('QA.keepRight.detail_description'); });
87534
87535           descriptionEnter
87536               .append('div')
87537               .attr('class', 'error-details-description-text')
87538               .html(errorDetail);
87539
87540           // If there are entity links in the error message..
87541           var relatedEntities = [];
87542           descriptionEnter.selectAll('.error_entity_link, .error_object_link')
87543               .each(function() {
87544                   var link = select(this);
87545                   var isObjectLink = link.classed('error_object_link');
87546                   var entityID = isObjectLink ?
87547                       (utilEntityRoot(_error.object_type) + _error.object_id)
87548                       : this.textContent;
87549                   var entity = context.hasEntity(entityID);
87550
87551                   relatedEntities.push(entityID);
87552
87553                   // Add click handler
87554                   link
87555                       .on('mouseover', function() {
87556                           context.surface().selectAll(utilEntityOrMemberSelector([entityID], context.graph()))
87557                               .classed('hover', true);
87558                       })
87559                       .on('mouseout', function() {
87560                           context.surface().selectAll('.hover')
87561                               .classed('hover', false);
87562                       })
87563                       .on('click', function() {
87564                           event.preventDefault();
87565                           var osmlayer = context.layers().layer('osm');
87566                           if (!osmlayer.enabled()) {
87567                               osmlayer.enabled(true);
87568                           }
87569
87570                           context.map().centerZoom(_error.loc, 20);
87571
87572                           if (entity) {
87573                               context.enter(modeSelect(context, [entityID]));
87574                           } else {
87575                               context.loadEntity(entityID, function() {
87576                                   context.enter(modeSelect(context, [entityID]));
87577                               });
87578                           }
87579                       });
87580
87581                   // Replace with friendly name if possible
87582                   // (The entity may not yet be loaded into the graph)
87583                   if (entity) {
87584                       var name = utilDisplayName(entity);  // try to use common name
87585
87586                       if (!name && !isObjectLink) {
87587                           var preset = context.presets().match(entity, context.graph());
87588                           name = preset && !preset.isFallback() && preset.name();  // fallback to preset name
87589                       }
87590
87591                       if (name) {
87592                           this.innerText = name;
87593                       }
87594                   }
87595               });
87596
87597           // Don't hide entities related to this error - #5880
87598           context.features().forceVisible(relatedEntities);
87599       }
87600
87601
87602       improveOsmDetails.error = function(val) {
87603           if (!arguments.length) return _error;
87604           _error = val;
87605           return improveOsmDetails;
87606       };
87607
87608
87609       return improveOsmDetails;
87610   }
87611
87612   function uiImproveOsmEditor(context) {
87613       var dispatch$1 = dispatch('change');
87614       var errorDetails = uiImproveOsmDetails(context);
87615       var errorComments = uiImproveOsmComments(context);
87616       var errorHeader = uiImproveOsmHeader(context);
87617       var quickLinks = uiQuickLinks();
87618
87619       var _error;
87620
87621
87622       function improveOsmEditor(selection) {
87623           // quick links
87624           var choices = [{
87625               id: 'zoom_to',
87626               label: 'inspector.zoom_to.title',
87627               tooltip: function() {
87628                   return uiTooltipHtml(t('inspector.zoom_to.tooltip_issue'), t('inspector.zoom_to.key'));
87629               },
87630               click: function zoomTo() {
87631                   context.mode().zoomToSelected();
87632               }
87633           }];
87634
87635
87636           var header = selection.selectAll('.header')
87637               .data([0]);
87638
87639           var headerEnter = header.enter()
87640               .append('div')
87641               .attr('class', 'header fillL');
87642
87643           headerEnter
87644               .append('button')
87645               .attr('class', 'fr error-editor-close')
87646               .on('click', function() {
87647                   context.enter(modeBrowse(context));
87648               })
87649               .call(svgIcon('#iD-icon-close'));
87650
87651           headerEnter
87652               .append('h3')
87653               .text(t('QA.improveOSM.title'));
87654
87655
87656           var body = selection.selectAll('.body')
87657               .data([0]);
87658
87659           body = body.enter()
87660               .append('div')
87661               .attr('class', 'body')
87662               .merge(body);
87663
87664           var editor = body.selectAll('.error-editor')
87665               .data([0]);
87666
87667           editor.enter()
87668               .append('div')
87669               .attr('class', 'modal-section error-editor')
87670               .merge(editor)
87671               .call(errorHeader.error(_error))
87672               .call(quickLinks.choices(choices))
87673               .call(errorDetails.error(_error))
87674               .call(errorComments.error(_error))
87675               .call(improveOsmSaveSection);
87676       }
87677
87678       function improveOsmSaveSection(selection) {
87679           var isSelected = (_error && _error.id === context.selectedErrorID());
87680           var isShown = (_error && (isSelected || _error.newComment || _error.comment));
87681           var saveSection = selection.selectAll('.error-save')
87682               .data(
87683                   (isShown ? [_error] : []),
87684                   function(d) { return d.id + '-' + (d.status || 0); }
87685               );
87686
87687           // exit
87688           saveSection.exit()
87689               .remove();
87690
87691           // enter
87692           var saveSectionEnter = saveSection.enter()
87693               .append('div')
87694               .attr('class', 'error-save save-section cf');
87695
87696           saveSectionEnter
87697               .append('h4')
87698               .attr('class', '.error-save-header')
87699               .text(t('note.newComment'));
87700
87701           saveSectionEnter
87702               .append('textarea')
87703               .attr('class', 'new-comment-input')
87704               .attr('placeholder', t('QA.keepRight.comment_placeholder'))
87705               .attr('maxlength', 1000)
87706               .property('value', function(d) { return d.newComment; })
87707               .call(utilNoAuto)
87708               .on('input', changeInput)
87709               .on('blur', changeInput);
87710
87711           // update
87712           saveSection = saveSectionEnter
87713               .merge(saveSection)
87714               .call(errorSaveButtons);
87715
87716           function changeInput() {
87717               var input = select(this);
87718               var val = input.property('value').trim();
87719
87720               if (val === '') {
87721                   val = undefined;
87722               }
87723
87724               // store the unsaved comment with the error itself
87725               _error = _error.update({ newComment: val });
87726
87727               var errorService = services.improveOSM;
87728               if (errorService) {
87729                   errorService.replaceError(_error);
87730               }
87731
87732               saveSection
87733                   .call(errorSaveButtons);
87734           }
87735       }
87736
87737       function errorSaveButtons(selection) {
87738           var isSelected = (_error && _error.id === context.selectedErrorID());
87739           var buttonSection = selection.selectAll('.buttons')
87740               .data((isSelected ? [_error] : []), function(d) { return d.status + d.id; });
87741
87742           // exit
87743           buttonSection.exit()
87744               .remove();
87745
87746           // enter
87747           var buttonEnter = buttonSection.enter()
87748               .append('div')
87749               .attr('class', 'buttons');
87750
87751           buttonEnter
87752               .append('button')
87753               .attr('class', 'button comment-button action')
87754               .text(t('QA.keepRight.save_comment'));
87755
87756           buttonEnter
87757               .append('button')
87758               .attr('class', 'button close-button action');
87759
87760           buttonEnter
87761               .append('button')
87762               .attr('class', 'button ignore-button action');
87763
87764
87765           // update
87766           buttonSection = buttonSection
87767               .merge(buttonEnter);
87768
87769           buttonSection.select('.comment-button')
87770               .attr('disabled', function(d) {
87771                   return d.newComment === undefined ? true : null;
87772               })
87773               .on('click.comment', function(d) {
87774                   this.blur();    // avoid keeping focus on the button - #4641
87775                   var errorService = services.improveOSM;
87776                   if (errorService) {
87777                       errorService.postUpdate(d, function(err, error) {
87778                           dispatch$1.call('change', error);
87779                       });
87780                   }
87781               });
87782
87783           buttonSection.select('.close-button')
87784               .text(function(d) {
87785                   var andComment = (d.newComment !== undefined ? '_comment' : '');
87786                   return t('QA.keepRight.close' + andComment);
87787               })
87788               .on('click.close', function(d) {
87789                   this.blur();    // avoid keeping focus on the button - #4641
87790                   var errorService = services.improveOSM;
87791                   if (errorService) {
87792                       d.newStatus = 'SOLVED';
87793                       errorService.postUpdate(d, function(err, error) {
87794                           dispatch$1.call('change', error);
87795                       });
87796                   }
87797               });
87798
87799           buttonSection.select('.ignore-button')
87800               .text(function(d) {
87801                   var andComment = (d.newComment !== undefined ? '_comment' : '');
87802                   return t('QA.keepRight.ignore' + andComment);
87803               })
87804               .on('click.ignore', function(d) {
87805                   this.blur();    // avoid keeping focus on the button - #4641
87806                   var errorService = services.improveOSM;
87807                   if (errorService) {
87808                       d.newStatus = 'INVALID';
87809                       errorService.postUpdate(d, function(err, error) {
87810                           dispatch$1.call('change', error);
87811                       });
87812                   }
87813               });
87814       }
87815
87816       improveOsmEditor.error = function(val) {
87817           if (!arguments.length) return _error;
87818           _error = val;
87819           return improveOsmEditor;
87820       };
87821
87822
87823       return utilRebind(improveOsmEditor, dispatch$1, 'on');
87824   }
87825
87826   function uiImproveOsmHeader() {
87827       var _error;
87828
87829
87830       function errorTitle(d) {
87831           var unknown = t('inspector.unknown');
87832
87833           if (!d) return unknown;
87834           var errorType = d.error_key;
87835           var et = en.QA.improveOSM.error_types[errorType];
87836
87837           if (et && et.title) {
87838               return t('QA.improveOSM.error_types.' + errorType + '.title');
87839           } else {
87840               return unknown;
87841           }
87842       }
87843
87844
87845       function improveOsmHeader(selection) {
87846           var header = selection.selectAll('.error-header')
87847               .data(
87848                   (_error ? [_error] : []),
87849                   function(d) { return d.id + '-' + (d.status || 0); }
87850               );
87851
87852           header.exit()
87853               .remove();
87854
87855           var headerEnter = header.enter()
87856               .append('div')
87857               .attr('class', 'error-header');
87858
87859           var iconEnter = headerEnter
87860               .append('div')
87861               .attr('class', 'error-header-icon')
87862               .classed('new', function(d) { return d.id < 0; });
87863
87864           var svgEnter = iconEnter
87865               .append('svg')
87866               .attr('width', '20px')
87867               .attr('height', '30px')
87868               .attr('viewbox', '0 0 20 30')
87869               .attr('class', function(d) {
87870                   return [
87871                       'preset-icon-28',
87872                       'qa_error',
87873                       d.service,
87874                       'error_id-' + d.id,
87875                       'error_type-' + d.error_type,
87876                       'category-' + d.category
87877                   ].join(' ');
87878               });
87879
87880           svgEnter
87881               .append('polygon')
87882               .attr('fill', 'currentColor')
87883               .attr('class', 'qa_error-fill')
87884               .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');
87885
87886           svgEnter
87887               .append('use')
87888               .attr('class', 'icon-annotation')
87889               .attr('width', '11px')
87890               .attr('height', '11px')
87891               .attr('transform', 'translate(4.5, 7)')
87892               .attr('xlink:href', function(d) {
87893                   var picon = d.icon;
87894
87895                   if (!picon) {
87896                       return '';
87897                   } else {
87898                       var isMaki = /^maki-/.test(picon);
87899                       return '#' + picon + (isMaki ? '-11' : '');
87900                   }
87901               });
87902
87903           headerEnter
87904               .append('div')
87905               .attr('class', 'error-header-label')
87906               .text(errorTitle);
87907       }
87908
87909
87910       improveOsmHeader.error = function(val) {
87911           if (!arguments.length) return _error;
87912           _error = val;
87913           return improveOsmHeader;
87914       };
87915
87916
87917       return improveOsmHeader;
87918   }
87919
87920   function uiPresetList(context) {
87921       var dispatch$1 = dispatch('choose');
87922       var _entityID;
87923       var _currentPreset;
87924       var _autofocus = false;
87925
87926
87927       function presetList(selection) {
87928           var entity = context.entity(_entityID);
87929           var geometry = context.geometry(_entityID);
87930
87931           // Treat entities on addr:interpolation lines as points, not vertices (#3241)
87932           if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
87933               geometry = 'point';
87934           }
87935
87936           var presets = context.presets().matchGeometry(geometry);
87937
87938           selection.html('');
87939
87940           var messagewrap = selection
87941               .append('div')
87942               .attr('class', 'header fillL');
87943
87944           var message = messagewrap
87945               .append('h3')
87946               .text(t('inspector.choose'));
87947
87948           messagewrap
87949               .append('button')
87950               .attr('class', 'preset-choose')
87951               .on('click', function() { dispatch$1.call('choose', this, _currentPreset); })
87952               .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'));
87953
87954           function initialKeydown() {
87955               // hack to let delete shortcut work when search is autofocused
87956               if (search.property('value').length === 0 &&
87957                   (event.keyCode === utilKeybinding.keyCodes['⌫'] ||
87958                    event.keyCode === utilKeybinding.keyCodes['⌦'])) {
87959                   event.preventDefault();
87960                   event.stopPropagation();
87961                   operationDelete([_entityID], context)();
87962
87963               // hack to let undo work when search is autofocused
87964               } else if (search.property('value').length === 0 &&
87965                   (event.ctrlKey || event.metaKey) &&
87966                   event.keyCode === utilKeybinding.keyCodes.z) {
87967                   event.preventDefault();
87968                   event.stopPropagation();
87969                   context.undo();
87970               } else if (!event.ctrlKey && !event.metaKey) {
87971                   // don't check for delete/undo hack on future keydown events
87972                   select(this).on('keydown', keydown);
87973                   keydown.call(this);
87974               }
87975           }
87976
87977           function keydown() {
87978               // down arrow
87979               if (event.keyCode === utilKeybinding.keyCodes['↓'] &&
87980                   // if insertion point is at the end of the string
87981                   search.node().selectionStart === search.property('value').length) {
87982                   event.preventDefault();
87983                   event.stopPropagation();
87984                   // move focus to the first item in the preset list
87985                   var buttons = list.selectAll('.preset-list-button');
87986                   if (!buttons.empty()) buttons.nodes()[0].focus();
87987               }
87988           }
87989
87990           function keypress() {
87991               // enter
87992               var value = search.property('value');
87993               if (event.keyCode === 13 && value.length) {
87994                   list.selectAll('.preset-list-item:first-child').datum().choose();
87995               }
87996           }
87997
87998           function inputevent() {
87999               var value = search.property('value');
88000               list.classed('filtered', value.length);
88001               if (value.length) {
88002                   var results = presets.search(value, geometry);
88003                   message.text(t('inspector.results', {
88004                       n: results.collection.length,
88005                       search: value
88006                   }));
88007                   list.call(drawList, results);
88008               } else {
88009                   list.call(drawList, context.presets().defaults(geometry, 36));
88010                   message.text(t('inspector.choose'));
88011               }
88012           }
88013
88014           var searchWrap = selection
88015               .append('div')
88016               .attr('class', 'search-header');
88017
88018           var search = searchWrap
88019               .append('input')
88020               .attr('class', 'preset-search-input')
88021               .attr('placeholder', t('inspector.search'))
88022               .attr('type', 'search')
88023               .call(utilNoAuto)
88024               .on('keydown', initialKeydown)
88025               .on('keypress', keypress)
88026               .on('input', inputevent);
88027
88028           searchWrap
88029               .call(svgIcon('#iD-icon-search', 'pre-text'));
88030
88031           if (_autofocus) {
88032               search.node().focus();
88033           }
88034
88035           var listWrap = selection
88036               .append('div')
88037               .attr('class', 'inspector-body');
88038
88039           var list = listWrap
88040               .append('div')
88041               .attr('class', 'preset-list fillL cf')
88042               .call(drawList, context.presets().defaults(geometry, 36));
88043
88044           context.features().on('change.preset-list', updateForFeatureHiddenState);
88045       }
88046
88047
88048       function drawList(list, presets) {
88049           var collection = presets.collection.reduce(function(collection, preset) {
88050               if (preset.members) {
88051                   collection.push(CategoryItem(preset));
88052               } else if (preset.visible()) {
88053                   collection.push(PresetItem(preset));
88054               }
88055               return collection;
88056           }, []);
88057
88058           var items = list.selectAll('.preset-list-item')
88059               .data(collection, function(d) { return d.preset.id; });
88060
88061           items.order();
88062
88063           items.exit()
88064               .remove();
88065
88066           items.enter()
88067               .append('div')
88068               .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
88069               .classed('current', function(item) { return item.preset === _currentPreset; })
88070               .each(function(item) { select(this).call(item); })
88071               .style('opacity', 0)
88072               .transition()
88073               .style('opacity', 1);
88074
88075           updateForFeatureHiddenState();
88076       }
88077
88078       function itemKeydown(){
88079           // the actively focused item
88080           var item = select(this.closest('.preset-list-item'));
88081           var parentItem = select(item.node().parentElement.closest('.preset-list-item'));
88082
88083           // arrow down, move focus to the next, lower item
88084           if (event.keyCode === utilKeybinding.keyCodes['↓']) {
88085               event.preventDefault();
88086               event.stopPropagation();
88087               // the next item in the list at the same level
88088               var nextItem = select(item.node().nextElementSibling);
88089               // if there is no next item in this list
88090               if (nextItem.empty()) {
88091                   // if there is a parent item
88092                   if (!parentItem.empty()) {
88093                       // the item is the last item of a sublist,
88094                       // select the next item at the parent level
88095                       nextItem = select(parentItem.node().nextElementSibling);
88096                   }
88097               // if the focused item is expanded
88098               } else if (select(this).classed('expanded')) {
88099                   // select the first subitem instead
88100                   nextItem = item.select('.subgrid .preset-list-item:first-child');
88101               }
88102               if (!nextItem.empty()) {
88103                   // focus on the next item
88104                   nextItem.select('.preset-list-button').node().focus();
88105               }
88106
88107           // arrow up, move focus to the previous, higher item
88108           } else if (event.keyCode === utilKeybinding.keyCodes['↑']) {
88109               event.preventDefault();
88110               event.stopPropagation();
88111               // the previous item in the list at the same level
88112               var previousItem = select(item.node().previousElementSibling);
88113
88114               // if there is no previous item in this list
88115               if (previousItem.empty()) {
88116                   // if there is a parent item
88117                   if (!parentItem.empty()) {
88118                       // the item is the first subitem of a sublist select the parent item
88119                       previousItem = parentItem;
88120                   }
88121               // if the previous item is expanded
88122               } else if (previousItem.select('.preset-list-button').classed('expanded')) {
88123                   // select the last subitem of the sublist of the previous item
88124                   previousItem = previousItem.select('.subgrid .preset-list-item:last-child');
88125               }
88126
88127               if (!previousItem.empty()) {
88128                   // focus on the previous item
88129                   previousItem.select('.preset-list-button').node().focus();
88130               } else {
88131                   // the focus is at the top of the list, move focus back to the search field
88132                   var search = select(this.closest('.preset-list-pane')).select('.preset-search-input');
88133                   search.node().focus();
88134               }
88135
88136           // arrow left, move focus to the parent item if there is one
88137           } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
88138               event.preventDefault();
88139               event.stopPropagation();
88140               // if there is a parent item, focus on the parent item
88141               if (!parentItem.empty()) {
88142                   parentItem.select('.preset-list-button').node().focus();
88143               }
88144
88145           // arrow right, choose this item
88146           } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
88147               event.preventDefault();
88148               event.stopPropagation();
88149               item.datum().choose.call(select(this).node());
88150           }
88151       }
88152
88153
88154       function CategoryItem(preset) {
88155           var box, sublist, shown = false;
88156
88157           function item(selection) {
88158               var wrap = selection.append('div')
88159                   .attr('class', 'preset-list-button-wrap category');
88160
88161               function click() {
88162                   var isExpanded = select(this).classed('expanded');
88163                   var iconName = isExpanded ?
88164                       (textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward') : '#iD-icon-down';
88165                   select(this)
88166                       .classed('expanded', !isExpanded);
88167                   select(this).selectAll('div.label-inner svg.icon use')
88168                       .attr('href', iconName);
88169                   item.choose();
88170               }
88171
88172               var button = wrap
88173                   .append('button')
88174                   .attr('class', 'preset-list-button')
88175                   .classed('expanded', false)
88176                   .call(uiPresetIcon()
88177                       .geometry(context.geometry(_entityID))
88178                       .preset(preset))
88179                   .on('click', click)
88180                   .on('keydown', function() {
88181                       // right arrow, expand the focused item
88182                       if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
88183                           event.preventDefault();
88184                           event.stopPropagation();
88185                           // if the item isn't expanded
88186                           if (!select(this).classed('expanded')) {
88187                               // toggle expansion (expand the item)
88188                               click.call(this);
88189                           }
88190                       // left arrow, collapse the focused item
88191                       } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
88192                           event.preventDefault();
88193                           event.stopPropagation();
88194                           // if the item is expanded
88195                           if (select(this).classed('expanded')) {
88196                               // toggle expansion (collapse the item)
88197                               click.call(this);
88198                           }
88199                       } else {
88200                           itemKeydown.call(this);
88201                       }
88202                   });
88203
88204               var label = button
88205                   .append('div')
88206                   .attr('class', 'label')
88207                   .append('div')
88208                   .attr('class', 'label-inner');
88209
88210               label
88211                   .append('div')
88212                   .attr('class', 'namepart')
88213                   .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'))
88214                   .append('span')
88215                   .html(function() { return preset.name() + '&hellip;'; });
88216
88217               box = selection.append('div')
88218                   .attr('class', 'subgrid')
88219                   .style('max-height', '0px')
88220                   .style('opacity', 0);
88221
88222               box.append('div')
88223                   .attr('class', 'arrow');
88224
88225               sublist = box.append('div')
88226                   .attr('class', 'preset-list fillL3');
88227           }
88228
88229
88230           item.choose = function() {
88231               if (!box || !sublist) return;
88232
88233               if (shown) {
88234                   shown = false;
88235                   box.transition()
88236                       .duration(200)
88237                       .style('opacity', '0')
88238                       .style('max-height', '0px')
88239                       .style('padding-bottom', '0px');
88240               } else {
88241                   shown = true;
88242                   sublist.call(drawList, preset.members);
88243                   box.transition()
88244                       .duration(200)
88245                       .style('opacity', '1')
88246                       .style('max-height', 200 + preset.members.collection.length * 190 + 'px')
88247                       .style('padding-bottom', '10px');
88248               }
88249           };
88250
88251           item.preset = preset;
88252           return item;
88253       }
88254
88255
88256       function PresetItem(preset) {
88257           function item(selection) {
88258               var wrap = selection.append('div')
88259                   .attr('class', 'preset-list-button-wrap');
88260
88261               var button = wrap.append('button')
88262                   .attr('class', 'preset-list-button')
88263                   .call(uiPresetIcon()
88264                       .geometry(context.geometry(_entityID))
88265                       .preset(preset))
88266                   .on('click', item.choose)
88267                   .on('keydown', itemKeydown);
88268
88269               var label = button
88270                   .append('div')
88271                   .attr('class', 'label')
88272                   .append('div')
88273                   .attr('class', 'label-inner');
88274
88275               // NOTE: split/join on en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
88276               label.selectAll('.namepart')
88277                   .data(preset.name().split(' – '))
88278                   .enter()
88279                   .append('div')
88280                   .attr('class', 'namepart')
88281                   .text(function(d) { return d; });
88282
88283               wrap.call(item.reference.button);
88284               selection.call(item.reference.body);
88285           }
88286
88287           item.choose = function() {
88288               if (select(this).classed('disabled')) return;
88289
88290               context.presets().choose(preset);
88291               context.perform(
88292                   actionChangePreset(_entityID, _currentPreset, preset),
88293                   t('operations.change_tags.annotation')
88294               );
88295
88296               dispatch$1.call('choose', this, preset);
88297           };
88298
88299           item.help = function() {
88300               event.stopPropagation();
88301               item.reference.toggle();
88302           };
88303
88304           item.preset = preset;
88305           item.reference = uiTagReference(preset.reference(context.geometry(_entityID)), context);
88306
88307           return item;
88308       }
88309
88310       function updateForFeatureHiddenState() {
88311
88312           if (!context.hasEntity(_entityID)) return;
88313
88314           var geometry = context.geometry(_entityID);
88315
88316           var button = d3_selectAll('.preset-list .preset-list-button');
88317
88318           // remove existing tooltips
88319           button.call(tooltip().destroyAny);
88320
88321           button.each(function(item, index) {
88322
88323               var hiddenPresetFeaturesId = context.features().isHiddenPreset(item.preset, geometry);
88324               var isHiddenPreset = !!hiddenPresetFeaturesId && item.preset !== _currentPreset;
88325
88326               select(this)
88327                   .classed('disabled', isHiddenPreset);
88328
88329               if (isHiddenPreset) {
88330                   var isAutoHidden = context.features().autoHidden(hiddenPresetFeaturesId);
88331                   var tooltipIdSuffix = isAutoHidden ? 'zoom' : 'manual';
88332                   var tooltipObj = { features: t('feature.' + hiddenPresetFeaturesId + '.description') };
88333                   select(this).call(tooltip()
88334                       .title(t('inspector.hidden_preset.' + tooltipIdSuffix, tooltipObj))
88335                       .placement(index < 2 ? 'bottom' : 'top')
88336                   );
88337               }
88338           });
88339       }
88340
88341       presetList.autofocus = function(val) {
88342           if (!arguments.length) return _autofocus;
88343           _autofocus = val;
88344           return presetList;
88345       };
88346
88347
88348       presetList.entityID = function(val) {
88349           if (!arguments.length) return _entityID;
88350           _entityID = val;
88351           presetList.preset(context.presets().match(context.entity(_entityID), context.graph()));
88352           return presetList;
88353       };
88354
88355
88356       presetList.preset = function(val) {
88357           if (!arguments.length) return _currentPreset;
88358           _currentPreset = val;
88359           return presetList;
88360       };
88361
88362
88363       return utilRebind(presetList, dispatch$1, 'on');
88364   }
88365
88366   function uiViewOnOSM(context) {
88367       var _what;   // an osmEntity or osmNote
88368
88369
88370       function viewOnOSM(selection) {
88371           var url;
88372           if (_what instanceof osmEntity) {
88373               url = context.connection().entityURL(_what);
88374           } else if (_what instanceof osmNote) {
88375               url = context.connection().noteURL(_what);
88376           }
88377
88378           var data = ((!_what || _what.isNew()) ? [] : [_what]);
88379           var link = selection.selectAll('.view-on-osm')
88380               .data(data, function(d) { return d.id; });
88381
88382           // exit
88383           link.exit()
88384               .remove();
88385
88386           // enter
88387           var linkEnter = link.enter()
88388               .append('a')
88389               .attr('class', 'view-on-osm')
88390               .attr('target', '_blank')
88391               .attr('href', url)
88392               .call(svgIcon('#iD-icon-out-link', 'inline'));
88393
88394           linkEnter
88395               .append('span')
88396               .text(t('inspector.view_on_osm'));
88397       }
88398
88399
88400       viewOnOSM.what = function(_) {
88401           if (!arguments.length) return _what;
88402           _what = _;
88403           return viewOnOSM;
88404       };
88405
88406       return viewOnOSM;
88407   }
88408
88409   function uiInspector(context) {
88410       var presetList = uiPresetList(context);
88411       var entityEditor = uiEntityEditor(context);
88412       var wrap = select(null),
88413           presetPane = select(null),
88414           editorPane = select(null);
88415       var _state = 'select';
88416       var _entityID;
88417       var _newFeature = false;
88418
88419
88420       function inspector(selection, newFeature) {
88421           presetList
88422               .entityID(_entityID)
88423               .autofocus(_newFeature)
88424               .on('choose', inspector.setPreset);
88425
88426           entityEditor
88427               .state(_state)
88428               .entityID(_entityID)
88429               .on('choose', inspector.showList);
88430
88431           wrap = selection.selectAll('.panewrap')
88432               .data([0]);
88433
88434           var enter = wrap.enter()
88435               .append('div')
88436               .attr('class', 'panewrap');
88437
88438           enter
88439               .append('div')
88440               .attr('class', 'preset-list-pane pane');
88441
88442           enter
88443               .append('div')
88444               .attr('class', 'entity-editor-pane pane');
88445
88446           wrap = wrap.merge(enter);
88447           presetPane = wrap.selectAll('.preset-list-pane');
88448           editorPane = wrap.selectAll('.entity-editor-pane');
88449
88450           var entity = context.entity(_entityID);
88451
88452           var isTaglessOrIntersectionVertex = entity.geometry(context.graph()) === 'vertex' &&
88453               (!entity.hasNonGeometryTags() && !entity.isHighwayIntersection(context.graph()));
88454           // start with the preset list if the feature is new or is an uninteresting vertex
88455           var showPresetList = newFeature || isTaglessOrIntersectionVertex;
88456
88457           if (showPresetList) {
88458               wrap.style('right', '-100%');
88459               presetPane.call(presetList);
88460           } else {
88461               wrap.style('right', '0%');
88462               editorPane.call(entityEditor);
88463           }
88464
88465           var footer = selection.selectAll('.footer')
88466               .data([0]);
88467
88468           footer = footer.enter()
88469               .append('div')
88470               .attr('class', 'footer')
88471               .merge(footer);
88472
88473           footer
88474               .call(uiViewOnOSM(context)
88475                   .what(context.hasEntity(_entityID))
88476               );
88477       }
88478
88479       inspector.showList = function(preset) {
88480           wrap.transition()
88481               .styleTween('right', function() { return interpolate('0%', '-100%'); });
88482
88483           presetPane
88484               .call(presetList.preset(preset).autofocus(true));
88485       };
88486
88487       inspector.setPreset = function(preset) {
88488
88489           // upon setting multipolygon, go to the area preset list instead of the editor
88490           if (preset.id === 'type/multipolygon') {
88491               presetPane
88492                   .call(presetList.preset(preset).autofocus(true));
88493
88494           } else {
88495               wrap.transition()
88496                   .styleTween('right', function() { return interpolate('-100%', '0%'); });
88497
88498               editorPane
88499                   .call(entityEditor.preset(preset));
88500           }
88501
88502       };
88503
88504       inspector.state = function(val) {
88505           if (!arguments.length) return _state;
88506           _state = val;
88507           entityEditor.state(_state);
88508
88509           // remove any old field help overlay that might have gotten attached to the inspector
88510           d3_selectAll('.field-help-body').remove();
88511
88512           return inspector;
88513       };
88514
88515
88516       inspector.entityID = function(val) {
88517           if (!arguments.length) return _entityID;
88518           _entityID = val;
88519           return inspector;
88520       };
88521
88522
88523       inspector.newFeature = function(val) {
88524           if (!arguments.length) return _newFeature;
88525           _newFeature = val;
88526           return inspector;
88527       };
88528
88529
88530       return inspector;
88531   }
88532
88533   function uiKeepRightDetails(context) {
88534       var _error;
88535
88536
88537       function errorDetail(d) {
88538           var unknown = t('inspector.unknown');
88539
88540           if (!d) return unknown;
88541           var errorType = d.error_type;
88542           var parentErrorType = d.parent_error_type;
88543
88544           var et = en.QA.keepRight.errorTypes[errorType];
88545           var pt = en.QA.keepRight.errorTypes[parentErrorType];
88546
88547           var detail;
88548           if (et && et.description) {
88549               detail = t('QA.keepRight.errorTypes.' + errorType + '.description', d.replacements);
88550           } else if (pt && pt.description) {
88551               detail = t('QA.keepRight.errorTypes.' + parentErrorType + '.description', d.replacements);
88552           } else {
88553               detail = unknown;
88554           }
88555
88556           return detail;
88557       }
88558
88559
88560       function keepRightDetails(selection) {
88561           var details = selection.selectAll('.error-details')
88562               .data(
88563                   (_error ? [_error] : []),
88564                   function(d) { return d.id + '-' + (d.status || 0); }
88565               );
88566
88567           details.exit()
88568               .remove();
88569
88570           var detailsEnter = details.enter()
88571               .append('div')
88572               .attr('class', 'error-details error-details-container');
88573
88574
88575           // description
88576           var descriptionEnter = detailsEnter
88577               .append('div')
88578               .attr('class', 'error-details-description');
88579
88580           descriptionEnter
88581               .append('h4')
88582               .text(function() { return t('QA.keepRight.detail_description'); });
88583
88584           descriptionEnter
88585               .append('div')
88586               .attr('class', 'error-details-description-text')
88587               .html(errorDetail);
88588
88589           // If there are entity links in the error message..
88590           var relatedEntities = [];
88591           descriptionEnter.selectAll('.error_entity_link, .error_object_link')
88592               .each(function() {
88593                   var link = select(this);
88594                   var isObjectLink = link.classed('error_object_link');
88595                   var entityID = isObjectLink ?
88596                       (utilEntityRoot(_error.object_type) + _error.object_id)
88597                       : this.textContent;
88598                   var entity = context.hasEntity(entityID);
88599
88600                   relatedEntities.push(entityID);
88601
88602                   // Add click handler
88603                   link
88604                       .on('mouseover', function() {
88605                           context.surface().selectAll(utilEntityOrMemberSelector([entityID], context.graph()))
88606                               .classed('hover', true);
88607                       })
88608                       .on('mouseout', function() {
88609                           context.surface().selectAll('.hover')
88610                               .classed('hover', false);
88611                       })
88612                       .on('click', function() {
88613                           event.preventDefault();
88614                           var osmlayer = context.layers().layer('osm');
88615                           if (!osmlayer.enabled()) {
88616                               osmlayer.enabled(true);
88617                           }
88618
88619                           context.map().centerZoomEase(_error.loc, 20);
88620
88621                           if (entity) {
88622                               context.enter(modeSelect(context, [entityID]));
88623                           } else {
88624                               context.loadEntity(entityID, function() {
88625                                   context.enter(modeSelect(context, [entityID]));
88626                               });
88627                           }
88628                       });
88629
88630                   // Replace with friendly name if possible
88631                   // (The entity may not yet be loaded into the graph)
88632                   if (entity) {
88633                       var name = utilDisplayName(entity);  // try to use common name
88634
88635                       if (!name && !isObjectLink) {
88636                           var preset = context.presets().match(entity, context.graph());
88637                           name = preset && !preset.isFallback() && preset.name();  // fallback to preset name
88638                       }
88639
88640                       if (name) {
88641                           this.innerText = name;
88642                       }
88643                   }
88644               });
88645
88646           // Don't hide entities related to this error - #5880
88647           context.features().forceVisible(relatedEntities);
88648       }
88649
88650
88651       keepRightDetails.error = function(val) {
88652           if (!arguments.length) return _error;
88653           _error = val;
88654           return keepRightDetails;
88655       };
88656
88657
88658       return keepRightDetails;
88659   }
88660
88661   function uiKeepRightEditor(context) {
88662       var dispatch$1 = dispatch('change');
88663       var keepRightDetails = uiKeepRightDetails(context);
88664       var keepRightHeader = uiKeepRightHeader(context);
88665       var quickLinks = uiQuickLinks();
88666
88667       var _error;
88668
88669
88670       function keepRightEditor(selection) {
88671           // quick links
88672           var choices = [{
88673               id: 'zoom_to',
88674               label: 'inspector.zoom_to.title',
88675               tooltip: function() {
88676                   return uiTooltipHtml(t('inspector.zoom_to.tooltip_issue'), t('inspector.zoom_to.key'));
88677               },
88678               click: function zoomTo() {
88679                   context.mode().zoomToSelected();
88680               }
88681           }];
88682
88683
88684           var header = selection.selectAll('.header')
88685               .data([0]);
88686
88687           var headerEnter = header.enter()
88688               .append('div')
88689               .attr('class', 'header fillL');
88690
88691           headerEnter
88692               .append('button')
88693               .attr('class', 'fr error-editor-close')
88694               .on('click', function() {
88695                   context.enter(modeBrowse(context));
88696               })
88697               .call(svgIcon('#iD-icon-close'));
88698
88699           headerEnter
88700               .append('h3')
88701               .text(t('QA.keepRight.title'));
88702
88703
88704           var body = selection.selectAll('.body')
88705               .data([0]);
88706
88707           body = body.enter()
88708               .append('div')
88709               .attr('class', 'body')
88710               .merge(body);
88711
88712           var editor = body.selectAll('.error-editor')
88713               .data([0]);
88714
88715           editor.enter()
88716               .append('div')
88717               .attr('class', 'modal-section error-editor')
88718               .merge(editor)
88719               .call(keepRightHeader.error(_error))
88720               .call(quickLinks.choices(choices))
88721               .call(keepRightDetails.error(_error))
88722               .call(keepRightSaveSection);
88723
88724
88725           var footer = selection.selectAll('.footer')
88726               .data([0]);
88727
88728           footer.enter()
88729               .append('div')
88730               .attr('class', 'footer')
88731               .merge(footer)
88732               .call(uiViewOnKeepRight(context).what(_error));
88733       }
88734
88735
88736       function keepRightSaveSection(selection) {
88737           var isSelected = (_error && _error.id === context.selectedErrorID());
88738           var isShown = (_error && (isSelected || _error.newComment || _error.comment));
88739           var saveSection = selection.selectAll('.error-save')
88740               .data(
88741                   (isShown ? [_error] : []),
88742                   function(d) { return d.id + '-' + (d.status || 0); }
88743               );
88744
88745           // exit
88746           saveSection.exit()
88747               .remove();
88748
88749           // enter
88750           var saveSectionEnter = saveSection.enter()
88751               .append('div')
88752               .attr('class', 'error-save save-section cf');
88753
88754           saveSectionEnter
88755               .append('h4')
88756               .attr('class', '.error-save-header')
88757               .text(t('QA.keepRight.comment'));
88758
88759           saveSectionEnter
88760               .append('textarea')
88761               .attr('class', 'new-comment-input')
88762               .attr('placeholder', t('QA.keepRight.comment_placeholder'))
88763               .attr('maxlength', 1000)
88764               .property('value', function(d) { return d.newComment || d.comment; })
88765               .call(utilNoAuto)
88766               .on('input', changeInput)
88767               .on('blur', changeInput);
88768
88769           // update
88770           saveSection = saveSectionEnter
88771               .merge(saveSection)
88772               .call(keepRightSaveButtons);
88773
88774
88775           function changeInput() {
88776               var input = select(this);
88777               var val = input.property('value').trim();
88778
88779               if (val === _error.comment) {
88780                   val = undefined;
88781               }
88782
88783               // store the unsaved comment with the error itself
88784               _error = _error.update({ newComment: val });
88785
88786               var keepRight = services.keepRight;
88787               if (keepRight) {
88788                   keepRight.replaceError(_error);  // update keepright cache
88789               }
88790
88791               saveSection
88792                   .call(keepRightSaveButtons);
88793           }
88794       }
88795
88796
88797       function keepRightSaveButtons(selection) {
88798           var isSelected = (_error && _error.id === context.selectedErrorID());
88799           var buttonSection = selection.selectAll('.buttons')
88800               .data((isSelected ? [_error] : []), function(d) { return d.status + d.id; });
88801
88802           // exit
88803           buttonSection.exit()
88804               .remove();
88805
88806           // enter
88807           var buttonEnter = buttonSection.enter()
88808               .append('div')
88809               .attr('class', 'buttons');
88810
88811           buttonEnter
88812               .append('button')
88813               .attr('class', 'button comment-button action')
88814               .text(t('QA.keepRight.save_comment'));
88815
88816           buttonEnter
88817               .append('button')
88818               .attr('class', 'button close-button action');
88819
88820           buttonEnter
88821               .append('button')
88822               .attr('class', 'button ignore-button action');
88823
88824
88825           // update
88826           buttonSection = buttonSection
88827               .merge(buttonEnter);
88828
88829           buttonSection.select('.comment-button')   // select and propagate data
88830               .attr('disabled', function(d) {
88831                   return d.newComment === undefined ? true : null;
88832               })
88833               .on('click.comment', function(d) {
88834                   this.blur();    // avoid keeping focus on the button - #4641
88835                   var keepRight = services.keepRight;
88836                   if (keepRight) {
88837                       keepRight.postKeepRightUpdate(d, function(err, error) {
88838                           dispatch$1.call('change', error);
88839                       });
88840                   }
88841               });
88842
88843           buttonSection.select('.close-button')   // select and propagate data
88844               .text(function(d) {
88845                   var andComment = (d.newComment !== undefined ? '_comment' : '');
88846                   return t('QA.keepRight.close' + andComment);
88847               })
88848               .on('click.close', function(d) {
88849                   this.blur();    // avoid keeping focus on the button - #4641
88850                   var keepRight = services.keepRight;
88851                   if (keepRight) {
88852                       d.state = 'ignore_t';   // ignore temporarily (error fixed)
88853                       keepRight.postKeepRightUpdate(d, function(err, error) {
88854                           dispatch$1.call('change', error);
88855                       });
88856                   }
88857               });
88858
88859           buttonSection.select('.ignore-button')   // select and propagate data
88860               .text(function(d) {
88861                   var andComment = (d.newComment !== undefined ? '_comment' : '');
88862                   return t('QA.keepRight.ignore' + andComment);
88863               })
88864               .on('click.ignore', function(d) {
88865                   this.blur();    // avoid keeping focus on the button - #4641
88866                   var keepRight = services.keepRight;
88867                   if (keepRight) {
88868                       d.state = 'ignore';   // ignore permanently (false positive)
88869                       keepRight.postKeepRightUpdate(d, function(err, error) {
88870                           dispatch$1.call('change', error);
88871                       });
88872                   }
88873               });
88874       }
88875
88876
88877       keepRightEditor.error = function(val) {
88878           if (!arguments.length) return _error;
88879           _error = val;
88880           return keepRightEditor;
88881       };
88882
88883
88884       return utilRebind(keepRightEditor, dispatch$1, 'on');
88885   }
88886
88887   function uiKeepRightHeader() {
88888       var _error;
88889
88890
88891       function errorTitle(d) {
88892           var unknown = t('inspector.unknown');
88893
88894           if (!d) return unknown;
88895           var errorType = d.error_type;
88896           var parentErrorType = d.parent_error_type;
88897
88898           var et = en.QA.keepRight.errorTypes[errorType];
88899           var pt = en.QA.keepRight.errorTypes[parentErrorType];
88900
88901           if (et && et.title) {
88902               return t('QA.keepRight.errorTypes.' + errorType + '.title');
88903           } else if (pt && pt.title) {
88904               return t('QA.keepRight.errorTypes.' + parentErrorType + '.title');
88905           } else {
88906               return unknown;
88907           }
88908       }
88909
88910
88911       function keepRightHeader(selection) {
88912           var header = selection.selectAll('.error-header')
88913               .data(
88914                   (_error ? [_error] : []),
88915                   function(d) { return d.id + '-' + (d.status || 0); }
88916               );
88917
88918           header.exit()
88919               .remove();
88920
88921           var headerEnter = header.enter()
88922               .append('div')
88923               .attr('class', 'error-header');
88924
88925           var iconEnter = headerEnter
88926               .append('div')
88927               .attr('class', 'error-header-icon')
88928               .classed('new', function(d) { return d.id < 0; });
88929
88930           iconEnter
88931               .append('div')
88932               .attr('class', function(d) {
88933                   return 'preset-icon-28 qa_error ' + d.service + ' error_id-' + d.id + ' error_type-' + d.parent_error_type;
88934               })
88935               .call(svgIcon('#iD-icon-bolt', 'qa_error-fill'));
88936
88937           headerEnter
88938               .append('div')
88939               .attr('class', 'error-header-label')
88940               .text(errorTitle);
88941       }
88942
88943
88944       keepRightHeader.error = function(val) {
88945           if (!arguments.length) return _error;
88946           _error = val;
88947           return keepRightHeader;
88948       };
88949
88950
88951       return keepRightHeader;
88952   }
88953
88954   function uiLasso(context) {
88955       var group, polygon;
88956
88957       lasso.coordinates = [];
88958
88959       function lasso(selection) {
88960           context.container()
88961               .classed('lasso', true);
88962
88963           group = selection
88964               .append('g')
88965               .attr('class', 'lasso hide');
88966
88967           polygon = group
88968               .append('path')
88969               .attr('class', 'lasso-path');
88970
88971           group
88972               .call(uiToggle(true));
88973       }
88974
88975
88976       function draw() {
88977           if (polygon) {
88978               polygon.data([lasso.coordinates])
88979                   .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
88980           }
88981       }
88982
88983
88984       lasso.extent = function () {
88985           return lasso.coordinates.reduce(function(extent, point) {
88986               return extent.extend(geoExtent(point));
88987           }, geoExtent());
88988       };
88989
88990
88991       lasso.p = function(_) {
88992           if (!arguments.length) return lasso;
88993           lasso.coordinates.push(_);
88994           draw();
88995           return lasso;
88996       };
88997
88998
88999       lasso.close = function() {
89000           if (group) {
89001               group.call(uiToggle(false, function() {
89002                   select(this).remove();
89003               }));
89004           }
89005           context.container().classed('lasso', false);
89006       };
89007
89008
89009       return lasso;
89010   }
89011
89012   function uiNoteComments() {
89013       var _note;
89014
89015
89016       function noteComments(selection) {
89017           if (_note.isNew()) return; // don't draw .comments-container
89018
89019           var comments = selection.selectAll('.comments-container')
89020               .data([0]);
89021
89022           comments = comments.enter()
89023               .append('div')
89024               .attr('class', 'comments-container')
89025               .merge(comments);
89026
89027           var commentEnter = comments.selectAll('.comment')
89028               .data(_note.comments)
89029               .enter()
89030               .append('div')
89031               .attr('class', 'comment');
89032
89033           commentEnter
89034               .append('div')
89035               .attr('class', function(d) { return 'comment-avatar user-' + d.uid; })
89036               .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
89037
89038           var mainEnter = commentEnter
89039               .append('div')
89040               .attr('class', 'comment-main');
89041
89042           var metadataEnter = mainEnter
89043               .append('div')
89044               .attr('class', 'comment-metadata');
89045
89046           metadataEnter
89047               .append('div')
89048               .attr('class', 'comment-author')
89049               .each(function(d) {
89050                   var selection = select(this);
89051                   var osm = services.osm;
89052                   if (osm && d.user) {
89053                       selection = selection
89054                           .append('a')
89055                           .attr('class', 'comment-author-link')
89056                           .attr('href', osm.userURL(d.user))
89057                           .attr('tabindex', -1)
89058                           .attr('target', '_blank');
89059                   }
89060                   selection
89061                       .text(function(d) { return d.user || t('note.anonymous'); });
89062               });
89063
89064           metadataEnter
89065               .append('div')
89066               .attr('class', 'comment-date')
89067               .text(function(d) {
89068                   return t('note.status.' + d.action, { when: localeDateString(d.date) });
89069               });
89070
89071           mainEnter
89072               .append('div')
89073               .attr('class', 'comment-text')
89074               .html(function(d) { return d.html; });
89075
89076           comments
89077               .call(replaceAvatars);
89078       }
89079
89080
89081       function replaceAvatars(selection) {
89082           var osm = services.osm;
89083           if (!osm) return;
89084
89085           var uids = {};  // gather uids in the comment thread
89086           _note.comments.forEach(function(d) {
89087               if (d.uid) uids[d.uid] = true;
89088           });
89089
89090           Object.keys(uids).forEach(function(uid) {
89091               osm.loadUser(uid, function(err, user) {
89092                   if (!user || !user.image_url) return;
89093
89094                   selection.selectAll('.comment-avatar.user-' + uid)
89095                       .html('')
89096                       .append('img')
89097                       .attr('class', 'icon comment-avatar-icon')
89098                       .attr('src', user.image_url)
89099                       .attr('alt', user.display_name);
89100               });
89101           });
89102       }
89103
89104
89105       function localeDateString(s) {
89106           if (!s) return null;
89107           var detected = utilDetect();
89108           var options = { day: 'numeric', month: 'short', year: 'numeric' };
89109           s = s.replace(/-/g, '/'); // fix browser-specific Date() issues
89110           var d = new Date(s);
89111           if (isNaN(d.getTime())) return null;
89112           return d.toLocaleDateString(detected.locale, options);
89113       }
89114
89115
89116       noteComments.note = function(val) {
89117           if (!arguments.length) return _note;
89118           _note = val;
89119           return noteComments;
89120       };
89121
89122
89123       return noteComments;
89124   }
89125
89126   function uiNoteEditor(context) {
89127       var dispatch$1 = dispatch('change');
89128       var quickLinks = uiQuickLinks();
89129       var noteComments = uiNoteComments();
89130       var noteHeader = uiNoteHeader();
89131
89132       // var formFields = uiFormFields(context);
89133
89134       var _note;
89135       // var _fieldsArr;
89136
89137
89138       function noteEditor(selection) {
89139           // quick links
89140           var choices = [{
89141               id: 'zoom_to',
89142               label: 'inspector.zoom_to.title',
89143               tooltip: function() {
89144                   return uiTooltipHtml(t('inspector.zoom_to.tooltip_note'), t('inspector.zoom_to.key'));
89145               },
89146               click: function zoomTo() {
89147                   context.mode().zoomToSelected();
89148               }
89149           }];
89150
89151
89152           var header = selection.selectAll('.header')
89153               .data([0]);
89154
89155           var headerEnter = header.enter()
89156               .append('div')
89157               .attr('class', 'header fillL');
89158
89159           headerEnter
89160               .append('button')
89161               .attr('class', 'fr note-editor-close')
89162               .on('click', function() {
89163                   context.enter(modeBrowse(context));
89164               })
89165               .call(svgIcon('#iD-icon-close'));
89166
89167           headerEnter
89168               .append('h3')
89169               .text(t('note.title'));
89170
89171
89172           var body = selection.selectAll('.body')
89173               .data([0]);
89174
89175           body = body.enter()
89176               .append('div')
89177               .attr('class', 'body')
89178               .merge(body);
89179
89180           var editor = body.selectAll('.note-editor')
89181               .data([0]);
89182
89183           editor.enter()
89184               .append('div')
89185               .attr('class', 'modal-section note-editor')
89186               .merge(editor)
89187               .call(noteHeader.note(_note))
89188               .call(quickLinks.choices(choices))
89189               .call(noteComments.note(_note))
89190               .call(noteSaveSection);
89191
89192
89193           var footer = selection.selectAll('.footer')
89194               .data([0]);
89195
89196           footer.enter()
89197               .append('div')
89198               .attr('class', 'footer')
89199               .merge(footer)
89200               .call(uiViewOnOSM(context).what(_note))
89201               .call(uiNoteReport(context).note(_note));
89202
89203
89204           // rerender the note editor on any auth change
89205           var osm = services.osm;
89206           if (osm) {
89207               osm.on('change.note-save', function() {
89208                   selection.call(noteEditor);
89209               });
89210           }
89211       }
89212
89213
89214       function noteSaveSection(selection) {
89215           var isSelected = (_note && _note.id === context.selectedNoteID());
89216           var noteSave = selection.selectAll('.note-save')
89217               .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
89218
89219           // exit
89220           noteSave.exit()
89221               .remove();
89222
89223           // enter
89224           var noteSaveEnter = noteSave.enter()
89225               .append('div')
89226               .attr('class', 'note-save save-section cf');
89227
89228           // // if new note, show categories to pick from
89229           // if (_note.isNew()) {
89230           //     var presets = context.presets();
89231
89232           //     // NOTE: this key isn't a age and therefore there is no documentation (yet)
89233           //     _fieldsArr = [
89234           //         uiField(context, presets.field('category'), null, { show: true, revert: false }),
89235           //     ];
89236
89237           //     _fieldsArr.forEach(function(field) {
89238           //         field
89239           //             .on('change', changeCategory);
89240           //     });
89241
89242           //     noteSaveEnter
89243           //         .append('div')
89244           //         .attr('class', 'note-category')
89245           //         .call(formFields.fieldsArr(_fieldsArr));
89246           // }
89247
89248           // function changeCategory() {
89249           //     // NOTE: perhaps there is a better way to get value
89250           //     var val = d3_select('input[name=\'category\']:checked').property('__data__') || undefined;
89251
89252           //     // store the unsaved category with the note itself
89253           //     _note = _note.update({ newCategory: val });
89254           //     var osm = services.osm;
89255           //     if (osm) {
89256           //         osm.replaceNote(_note);  // update note cache
89257           //     }
89258           //     noteSave
89259           //         .call(noteSaveButtons);
89260           // }
89261
89262           noteSaveEnter
89263               .append('h4')
89264               .attr('class', '.note-save-header')
89265               .text(function() {
89266                   return _note.isNew() ? t('note.newDescription') : t('note.newComment');
89267               });
89268
89269           noteSaveEnter
89270               .append('textarea')
89271               .attr('class', 'new-comment-input')
89272               .attr('placeholder', t('note.inputPlaceholder'))
89273               .attr('maxlength', 1000)
89274               .property('value', function(d) { return d.newComment; })
89275               .call(utilNoAuto)
89276               .on('keydown.note-input', keydown)
89277               .on('input.note-input', changeInput)
89278               .on('blur.note-input', changeInput);
89279
89280           // update
89281           noteSave = noteSaveEnter
89282               .merge(noteSave)
89283               .call(userDetails)
89284               .call(noteSaveButtons);
89285
89286
89287           // fast submit if user presses cmd+enter
89288           function keydown() {
89289               if (!(event.keyCode === 13 && event.metaKey)) return;
89290
89291               var osm = services.osm;
89292               if (!osm) return;
89293
89294               var hasAuth = osm.authenticated();
89295               if (!hasAuth) return;
89296
89297               if (!_note.newComment) return;
89298
89299               event.preventDefault();
89300
89301               select(this)
89302                   .on('keydown.note-input', null);
89303
89304               // focus on button and submit
89305               window.setTimeout(function() {
89306                   if (_note.isNew()) {
89307                       noteSave.selectAll('.save-button').node().focus();
89308                       clickSave(_note);
89309                   } else  {
89310                       noteSave.selectAll('.comment-button').node().focus();
89311                       clickComment(_note);
89312                   }
89313               }, 10);
89314           }
89315
89316
89317           function changeInput() {
89318               var input = select(this);
89319               var val = input.property('value').trim() || undefined;
89320
89321               // store the unsaved comment with the note itself
89322               _note = _note.update({ newComment: val });
89323
89324               var osm = services.osm;
89325               if (osm) {
89326                   osm.replaceNote(_note);  // update note cache
89327               }
89328
89329               noteSave
89330                   .call(noteSaveButtons);
89331           }
89332       }
89333
89334
89335       function userDetails(selection) {
89336           var detailSection = selection.selectAll('.detail-section')
89337               .data([0]);
89338
89339           detailSection = detailSection.enter()
89340               .append('div')
89341               .attr('class', 'detail-section')
89342               .merge(detailSection);
89343
89344           var osm = services.osm;
89345           if (!osm) return;
89346
89347           // Add warning if user is not logged in
89348           var hasAuth = osm.authenticated();
89349           var authWarning = detailSection.selectAll('.auth-warning')
89350               .data(hasAuth ? [] : [0]);
89351
89352           authWarning.exit()
89353               .transition()
89354               .duration(200)
89355               .style('opacity', 0)
89356               .remove();
89357
89358           var authEnter = authWarning.enter()
89359               .insert('div', '.tag-reference-body')
89360               .attr('class', 'field-warning auth-warning')
89361               .style('opacity', 0);
89362
89363           authEnter
89364               .call(svgIcon('#iD-icon-alert', 'inline'));
89365
89366           authEnter
89367               .append('span')
89368               .text(t('note.login'));
89369
89370           authEnter
89371               .append('a')
89372               .attr('target', '_blank')
89373               .call(svgIcon('#iD-icon-out-link', 'inline'))
89374               .append('span')
89375               .text(t('login'))
89376               .on('click.note-login', function() {
89377                   event.preventDefault();
89378                   osm.authenticate();
89379               });
89380
89381           authEnter
89382               .transition()
89383               .duration(200)
89384               .style('opacity', 1);
89385
89386
89387           var prose = detailSection.selectAll('.note-save-prose')
89388               .data(hasAuth ? [0] : []);
89389
89390           prose.exit()
89391               .remove();
89392
89393           prose = prose.enter()
89394               .append('p')
89395               .attr('class', 'note-save-prose')
89396               .text(t('note.upload_explanation'))
89397               .merge(prose);
89398
89399           osm.userDetails(function(err, user) {
89400               if (err) return;
89401
89402               var userLink = select(document.createElement('div'));
89403
89404               if (user.image_url) {
89405                   userLink
89406                       .append('img')
89407                       .attr('src', user.image_url)
89408                       .attr('class', 'icon pre-text user-icon');
89409               }
89410
89411               userLink
89412                   .append('a')
89413                   .attr('class', 'user-info')
89414                   .text(user.display_name)
89415                   .attr('href', osm.userURL(user.display_name))
89416                   .attr('tabindex', -1)
89417                   .attr('target', '_blank');
89418
89419               prose
89420                   .html(t('note.upload_explanation_with_user', { user: userLink.html() }));
89421           });
89422       }
89423
89424
89425       function noteSaveButtons(selection) {
89426           var osm = services.osm;
89427           var hasAuth = osm && osm.authenticated();
89428
89429           var isSelected = (_note && _note.id === context.selectedNoteID());
89430           var buttonSection = selection.selectAll('.buttons')
89431               .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
89432
89433           // exit
89434           buttonSection.exit()
89435               .remove();
89436
89437           // enter
89438           var buttonEnter = buttonSection.enter()
89439               .append('div')
89440               .attr('class', 'buttons');
89441
89442           if (_note.isNew()) {
89443               buttonEnter
89444                   .append('button')
89445                   .attr('class', 'button cancel-button secondary-action')
89446                   .text(t('confirm.cancel'));
89447
89448               buttonEnter
89449                   .append('button')
89450                   .attr('class', 'button save-button action')
89451                   .text(t('note.save'));
89452
89453           } else {
89454               buttonEnter
89455                   .append('button')
89456                   .attr('class', 'button status-button action');
89457
89458               buttonEnter
89459                   .append('button')
89460                   .attr('class', 'button comment-button action')
89461                   .text(t('note.comment'));
89462           }
89463
89464
89465           // update
89466           buttonSection = buttonSection
89467               .merge(buttonEnter);
89468
89469           buttonSection.select('.cancel-button')   // select and propagate data
89470               .on('click.cancel', clickCancel);
89471
89472           buttonSection.select('.save-button')     // select and propagate data
89473               .attr('disabled', isSaveDisabled)
89474               .on('click.save', clickSave);
89475
89476           buttonSection.select('.status-button')   // select and propagate data
89477               .attr('disabled', (hasAuth ? null : true))
89478               .text(function(d) {
89479                   var action = (d.status === 'open' ? 'close' : 'open');
89480                   var andComment = (d.newComment ? '_comment' : '');
89481                   return t('note.' + action + andComment);
89482               })
89483               .on('click.status', clickStatus);
89484
89485           buttonSection.select('.comment-button')   // select and propagate data
89486               .attr('disabled', isSaveDisabled)
89487               .on('click.comment', clickComment);
89488
89489
89490           function isSaveDisabled(d) {
89491               return (hasAuth && d.status === 'open' && d.newComment) ? null : true;
89492           }
89493       }
89494
89495
89496
89497       function clickCancel(d) {
89498           this.blur();    // avoid keeping focus on the button - #4641
89499           var osm = services.osm;
89500           if (osm) {
89501               osm.removeNote(d);
89502           }
89503           context.enter(modeBrowse(context));
89504           dispatch$1.call('change');
89505       }
89506
89507
89508       function clickSave(d) {
89509           this.blur();    // avoid keeping focus on the button - #4641
89510           var osm = services.osm;
89511           if (osm) {
89512               osm.postNoteCreate(d, function(err, note) {
89513                   dispatch$1.call('change', note);
89514               });
89515           }
89516       }
89517
89518
89519       function clickStatus(d) {
89520           this.blur();    // avoid keeping focus on the button - #4641
89521           var osm = services.osm;
89522           if (osm) {
89523               var setStatus = (d.status === 'open' ? 'closed' : 'open');
89524               osm.postNoteUpdate(d, setStatus, function(err, note) {
89525                   dispatch$1.call('change', note);
89526               });
89527           }
89528       }
89529
89530       function clickComment(d) {
89531           this.blur();    // avoid keeping focus on the button - #4641
89532           var osm = services.osm;
89533           if (osm) {
89534               osm.postNoteUpdate(d, d.status, function(err, note) {
89535                   dispatch$1.call('change', note);
89536               });
89537           }
89538       }
89539
89540
89541       noteEditor.note = function(val) {
89542           if (!arguments.length) return _note;
89543           _note = val;
89544           return noteEditor;
89545       };
89546
89547
89548       return utilRebind(noteEditor, dispatch$1, 'on');
89549   }
89550
89551   function uiNoteHeader() {
89552       var _note;
89553
89554
89555       function noteHeader(selection) {
89556           var header = selection.selectAll('.note-header')
89557               .data(
89558                   (_note ? [_note] : []),
89559                   function(d) { return d.status + d.id; }
89560               );
89561
89562           header.exit()
89563               .remove();
89564
89565           var headerEnter = header.enter()
89566               .append('div')
89567               .attr('class', 'note-header');
89568
89569           var iconEnter = headerEnter
89570               .append('div')
89571               .attr('class', function(d) { return 'note-header-icon ' + d.status; })
89572               .classed('new', function(d) { return d.id < 0; });
89573
89574           iconEnter
89575               .append('div')
89576               .attr('class', 'preset-icon-28')
89577               .call(svgIcon('#iD-icon-note', 'note-fill'));
89578
89579           iconEnter.each(function(d) {
89580               var statusIcon = '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
89581               iconEnter
89582                   .append('div')
89583                   .attr('class', 'note-icon-annotation')
89584                   .call(svgIcon(statusIcon, 'icon-annotation'));
89585           });
89586
89587           headerEnter
89588               .append('div')
89589               .attr('class', 'note-header-label')
89590               .text(function(d) {
89591                   if (_note.isNew()) { return t('note.new'); }
89592                   return t('note.note') + ' ' + d.id + ' ' +
89593                       (d.status === 'closed' ? t('note.closed') : '');
89594               });
89595       }
89596
89597
89598       noteHeader.note = function(val) {
89599           if (!arguments.length) return _note;
89600           _note = val;
89601           return noteHeader;
89602       };
89603
89604
89605       return noteHeader;
89606   }
89607
89608   function uiNoteReport() {
89609       var _note;
89610
89611       function noteReport(selection) {
89612           var url;
89613           if (services.osm && (_note instanceof osmNote) && (!_note.isNew())) {
89614               url = services.osm.noteReportURL(_note);
89615           }
89616
89617           var link = selection.selectAll('.note-report')
89618               .data(url ? [url] : []);
89619
89620           // exit
89621           link.exit()
89622               .remove();
89623
89624           // enter
89625           var linkEnter = link.enter()
89626               .append('a')
89627               .attr('class', 'note-report')
89628               .attr('target', '_blank')
89629               .attr('href', function(d) { return d; })
89630               .call(svgIcon('#iD-icon-out-link', 'inline'));
89631
89632           linkEnter
89633               .append('span')
89634               .text(t('note.report'));
89635       }
89636
89637
89638       noteReport.note = function(val) {
89639           if (!arguments.length) return _note;
89640           _note = val;
89641           return noteReport;
89642       };
89643
89644       return noteReport;
89645   }
89646
89647   function uiRadialMenu(context, operations) {
89648       var menu;
89649       var center = [0, 0];
89650       var tooltip;
89651
89652
89653       var radialMenu = function(selection) {
89654           if (!operations.length) return;
89655
89656           selection.node().parentNode.focus();
89657
89658           function click(operation) {
89659               event.stopPropagation();
89660               if (operation.disabled()) return;
89661               operation();
89662               radialMenu.close();
89663           }
89664
89665           menu = selection
89666               .append('g')
89667               .attr('class', 'radial-menu')
89668               .attr('transform', 'translate(' + center + ')')
89669               .attr('opacity', 0);
89670
89671           menu
89672               .transition()
89673               .attr('opacity', 1);
89674
89675           var r = 50;
89676           var a = Math.PI / 4;
89677           var a0 = -Math.PI / 4;
89678           var a1 = a0 + (operations.length - 1) * a;
89679
89680           menu
89681               .append('path')
89682               .attr('class', 'radial-menu-background')
89683               .attr('d', 'M' + r * Math.sin(a0) + ',' +
89684                                r * Math.cos(a0) +
89685                         ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
89686                                (r * Math.sin(a1) + 1e-3) + ',' +
89687                                (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
89688               .attr('stroke-width', 50)
89689               .attr('stroke-linecap', 'round');
89690
89691           var button = menu.selectAll()
89692               .data(operations)
89693               .enter()
89694               .append('g')
89695               .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
89696               .classed('disabled', function(d) { return d.disabled(); })
89697               .attr('transform', function(d, i) {
89698                   return 'translate(' + geoVecFloor([
89699                           r * Math.sin(a0 + i * a),
89700                           r * Math.cos(a0 + i * a)]).join(',') + ')';
89701               });
89702
89703           button
89704               .append('circle')
89705               .attr('r', 15)
89706               .on('click', click)
89707               .on('mousedown', mousedown)
89708               .on('mouseover', mouseover)
89709               .on('mouseout', mouseout);
89710
89711           button
89712               .append('use')
89713               .attr('transform', 'translate(-10,-10)')
89714               .attr('width', '20')
89715               .attr('height', '20')
89716               .attr('xlink:href', function(d) { return '#iD-operation-' + d.id; });
89717
89718           tooltip = select(document.body)
89719               .append('div')
89720               .attr('class', 'tooltip-inner radial-menu-tooltip');
89721
89722           function mousedown() {
89723               event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
89724           }
89725
89726           function mouseover(d, i) {
89727               var rect = context.surfaceRect();
89728               var angle = a0 + i * a;
89729               var top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px';
89730               var left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px';
89731               var bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px';
89732               var right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
89733
89734               tooltip
89735                   .style('top', null)
89736                   .style('left', null)
89737                   .style('bottom', null)
89738                   .style('right', null)
89739                   .style('display', 'block')
89740                   .html(uiTooltipHtml(d.tooltip(), d.keys[0]));
89741
89742               if (i === 0) {
89743                   tooltip
89744                       .style('right', right)
89745                       .style('top', top);
89746               } else if (i >= 4) {
89747                   tooltip
89748                       .style('left', left)
89749                       .style('bottom', bottom);
89750               } else {
89751                   tooltip
89752                       .style('left', left)
89753                       .style('top', top);
89754               }
89755           }
89756
89757           function mouseout() {
89758               tooltip.style('display', 'none');
89759           }
89760       };
89761
89762
89763       radialMenu.close = function() {
89764           if (menu) {
89765               menu
89766                   .style('pointer-events', 'none')
89767                   .transition()
89768                   .attr('opacity', 0)
89769                   .remove();
89770           }
89771
89772           if (tooltip) {
89773               tooltip.remove();
89774           }
89775       };
89776
89777
89778       radialMenu.center = function(_) {
89779           if (!arguments.length) return center;
89780           center = _;
89781           return radialMenu;
89782       };
89783
89784
89785       return radialMenu;
89786   }
89787
89788   function uiSelectionList(context, selectedIDs) {
89789
89790       function selectEntity(entity) {
89791           context.enter(modeSelect(context, [entity.id]));
89792       }
89793
89794
89795       function deselectEntity(entity) {
89796           event.stopPropagation();
89797           var index = selectedIDs.indexOf(entity.id);
89798           if (index > -1) {
89799               selectedIDs.splice(index, 1);
89800           }
89801           context.enter(modeSelect(context, selectedIDs));
89802       }
89803
89804
89805       function selectionList(selection) {
89806           selection.classed('selection-list-pane', true);
89807
89808           var header = selection
89809               .append('div')
89810               .attr('class', 'header fillL cf');
89811
89812           header
89813               .append('h3')
89814               .text(t('inspector.multiselect'));
89815
89816           var listWrap = selection
89817               .append('div')
89818               .attr('class', 'inspector-body');
89819
89820           var list = listWrap
89821               .append('div')
89822               .attr('class', 'feature-list cf');
89823
89824           context.history().on('change.selection-list', drawList);
89825           drawList();
89826
89827
89828           function drawList() {
89829               var entities = selectedIDs
89830                   .map(function(id) { return context.hasEntity(id); })
89831                   .filter(function(entity) { return entity; });
89832
89833               var items = list.selectAll('.feature-list-item')
89834                   .data(entities, osmEntity.key);
89835
89836               items.exit()
89837                   .remove();
89838
89839               // Enter
89840               var enter = items.enter()
89841                   .append('div')
89842                   .attr('class', 'feature-list-item')
89843                   .on('click', selectEntity);
89844
89845               enter
89846                   .each(function(d) {
89847                       select(this).on('mouseover', function() {
89848                           utilHighlightEntities([d.id], true, context);
89849                       });
89850                       select(this).on('mouseout', function() {
89851                           utilHighlightEntities([d.id], false, context);
89852                       });
89853                   });
89854
89855               var label = enter
89856                   .append('button')
89857                   .attr('class', 'label');
89858
89859               enter
89860                   .append('button')
89861                   .attr('class', 'close')
89862                   .on('click', deselectEntity)
89863                   .call(svgIcon('#iD-icon-close'));
89864
89865               label
89866                   .append('span')
89867                   .attr('class', 'entity-geom-icon')
89868                   .call(svgIcon('', 'pre-text'));
89869
89870               label
89871                   .append('span')
89872                   .attr('class', 'entity-type');
89873
89874               label
89875                   .append('span')
89876                   .attr('class', 'entity-name');
89877
89878               // Update
89879               items = items.merge(enter);
89880
89881               items.selectAll('.entity-geom-icon use')
89882                   .attr('href', function() {
89883                       var entity = this.parentNode.parentNode.__data__;
89884                       return '#iD-icon-' + context.geometry(entity.id);
89885                   });
89886
89887               items.selectAll('.entity-type')
89888                   .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
89889
89890               items.selectAll('.entity-name')
89891                   .text(function(entity) { return utilDisplayName(entity); });
89892           }
89893       }
89894
89895       return selectionList;
89896   }
89897
89898   function uiSourceSwitch(context) {
89899       var keys;
89900
89901
89902       function click() {
89903           event.preventDefault();
89904
89905           var osm = context.connection();
89906           if (!osm) return;
89907
89908           if (context.inIntro()) return;
89909
89910           if (context.history().hasChanges() &&
89911               !window.confirm(t('source_switch.lose_changes'))) return;
89912
89913           var isLive = select(this)
89914               .classed('live');
89915
89916           isLive = !isLive;
89917           context.enter(modeBrowse(context));
89918           context.history().clearSaved();          // remove saved history
89919           context.flush();                         // remove stored data
89920
89921           select(this)
89922               .text(isLive ? t('source_switch.live') : t('source_switch.dev'))
89923               .classed('live', isLive);
89924
89925           osm.switch(isLive ? keys[0] : keys[1]);  // switch connection (warning: dispatches 'change' event)
89926       }
89927
89928       var sourceSwitch = function(selection) {
89929           selection
89930               .append('a')
89931               .attr('href', '#')
89932               .text(t('source_switch.live'))
89933               .classed('live', true)
89934               .attr('tabindex', -1)
89935               .on('click', click);
89936       };
89937
89938
89939       sourceSwitch.keys = function(_) {
89940           if (!arguments.length) return keys;
89941           keys = _;
89942           return sourceSwitch;
89943       };
89944
89945
89946       return sourceSwitch;
89947   }
89948
89949   function uiSuccess(context) {
89950       var MAXEVENTS = 2;
89951
89952       // All else being equal, rank more "social" communities higher
89953       // (anything not in this list receives no adjustment)
89954       var COMMUNITYRANK = {
89955           'meetup': +5,
89956           'slack': +4,
89957           'facebook': +3,
89958           'reddit': +2,
89959           'forum': -2,
89960           'mailinglist': -3,
89961           'irc': -4
89962       };
89963
89964       var detected = utilDetect();
89965       var dispatch$1 = dispatch('cancel');
89966       var _changeset;
89967       var _location;
89968
89969
89970       // string-to-date parsing in JavaScript is weird
89971       function parseEventDate(when) {
89972           if (!when) return;
89973
89974           var raw = when.trim();
89975           if (!raw) return;
89976
89977           if (!/Z$/.test(raw)) {    // if no trailing 'Z', add one
89978               raw += 'Z';           // this forces date to be parsed as a UTC date
89979           }
89980
89981           var parsed = new Date(raw);
89982           return new Date(parsed.toUTCString().substr(0, 25));  // convert to local timezone
89983       }
89984
89985
89986       function success(selection) {
89987           var header = selection
89988               .append('div')
89989               .attr('class', 'header fillL');
89990
89991           header
89992               .append('button')
89993               .attr('class', 'fr')
89994               .on('click', function() { dispatch$1.call('cancel'); })
89995               .call(svgIcon('#iD-icon-close'));
89996
89997           header
89998               .append('h3')
89999               .text(t('success.just_edited'));
90000
90001           var body = selection
90002               .append('div')
90003               .attr('class', 'body save-success fillL');
90004
90005           var summary = body
90006               .append('div')
90007               .attr('class', 'save-summary');
90008
90009           summary
90010               .append('h3')
90011               .text(t('success.thank_you' + (_location ? '_location' : ''), { where: _location }));
90012
90013           summary
90014               .append('p')
90015               .text(t('success.help_html'))
90016               .append('a')
90017               .attr('class', 'link-out')
90018               .attr('target', '_blank')
90019               .attr('tabindex', -1)
90020               .attr('href', t('success.help_link_url'))
90021               .call(svgIcon('#iD-icon-out-link', 'inline'))
90022               .append('span')
90023               .text(t('success.help_link_text'));
90024
90025           var osm = context.connection();
90026           if (!osm) return;
90027
90028           var changesetURL = osm.changesetURL(_changeset.id);
90029
90030           var table = summary
90031               .append('table')
90032               .attr('class', 'summary-table');
90033
90034           var row = table
90035               .append('tr')
90036               .attr('class', 'summary-row');
90037
90038           row
90039               .append('td')
90040               .attr('class', 'cell-icon summary-icon')
90041               .append('a')
90042               .attr('target', '_blank')
90043               .attr('href', changesetURL)
90044               .append('svg')
90045               .attr('class', 'logo-small')
90046               .append('use')
90047               .attr('xlink:href', '#iD-logo-osm');
90048
90049           var summaryDetail = row
90050               .append('td')
90051               .attr('class', 'cell-detail summary-detail');
90052
90053           summaryDetail
90054               .append('a')
90055               .attr('class', 'cell-detail summary-view-on-osm')
90056               .attr('target', '_blank')
90057               .attr('href', changesetURL)
90058               .text(t('success.view_on_osm'));
90059
90060           summaryDetail
90061               .append('div')
90062               .text(t('success.changeset_id', { changeset_id: _changeset.id }));
90063
90064
90065           // Gather community polygon IDs intersecting the map..
90066           var matchFeatures = data.community.query(context.map().center(), true) || [];
90067           var matchIDs = matchFeatures.map(function(feature) { return feature.id; });
90068
90069           // Gather community resources that are either global or match a polygon.
90070           var matchResources = filter(data.community.resources, function(v) {
90071               return !v.featureId || matchIDs.indexOf(v.featureId) !== -1;
90072           });
90073
90074           if (matchResources.length) {
90075               // sort by size ascending, then by community rank
90076               matchResources.sort(function(a, b) {
90077                   var aSize = Infinity;
90078                   var bSize = Infinity;
90079                   var aRank = COMMUNITYRANK[a.type] || 0;
90080                   var bRank = COMMUNITYRANK[b.type] || 0;
90081
90082                   if (a.featureId) {
90083                       aSize = data.community.features[a.featureId].properties.area;
90084                   }
90085                   if (b.featureId) {
90086                       bSize = data.community.features[b.featureId].properties.area;
90087                   }
90088
90089                   return aSize < bSize ? -1 : aSize > bSize ? 1 : bRank - aRank;
90090               });
90091
90092               body
90093                   .call(showCommunityLinks, matchResources);
90094           }
90095       }
90096
90097
90098       function showCommunityLinks(selection, matchResources) {
90099           var communityLinks = selection
90100               .append('div')
90101               .attr('class', 'save-communityLinks');
90102
90103           communityLinks
90104               .append('h3')
90105               .text(t('success.like_osm'));
90106
90107           var table = communityLinks
90108               .append('table')
90109               .attr('class', 'community-table');
90110
90111           var row = table.selectAll('.community-row')
90112               .data(matchResources);
90113
90114           var rowEnter = row.enter()
90115               .append('tr')
90116               .attr('class', 'community-row');
90117
90118           rowEnter
90119               .append('td')
90120               .attr('class', 'cell-icon community-icon')
90121               .append('a')
90122               .attr('target', '_blank')
90123               .attr('href', function(d) { return d.url; })
90124               .append('svg')
90125               .attr('class', 'logo-small')
90126               .append('use')
90127               .attr('xlink:href', function(d) { return '#community-' + d.type; });
90128
90129           var communityDetail = rowEnter
90130               .append('td')
90131               .attr('class', 'cell-detail community-detail');
90132
90133           communityDetail
90134               .each(showCommunityDetails);
90135
90136           communityLinks
90137               .append('div')
90138               .attr('class', 'community-missing')
90139               .text(t('success.missing'))
90140               .append('a')
90141               .attr('class', 'link-out')
90142               .attr('target', '_blank')
90143               .attr('tabindex', -1)
90144               .call(svgIcon('#iD-icon-out-link', 'inline'))
90145               .attr('href', 'https://github.com/osmlab/osm-community-index/issues')
90146               .append('span')
90147               .text(t('success.tell_us'));
90148       }
90149
90150
90151       function showCommunityDetails(d) {
90152           var selection = select(this);
90153           var communityID = d.id;
90154           var replacements = {
90155               url: linkify(d.url),
90156               signupUrl: linkify(d.signupUrl || d.url)
90157           };
90158
90159           selection
90160               .append('div')
90161               .attr('class', 'community-name')
90162               .append('a')
90163               .attr('target', '_blank')
90164               .attr('href', d.url)
90165               .text(t('community.' + d.id + '.name'));
90166
90167           var descriptionHTML = t('community.' + d.id + '.description', replacements);
90168
90169           if (d.type === 'reddit') {   // linkify subreddits  #4997
90170               descriptionHTML = descriptionHTML
90171                   .replace(/(\/r\/\w*\/*)/i, function(match) { return linkify(d.url, match); });
90172           }
90173
90174           selection
90175               .append('div')
90176               .attr('class', 'community-description')
90177               .html(descriptionHTML);
90178
90179           if (d.extendedDescription || (d.languageCodes && d.languageCodes.length)) {
90180               selection
90181                   .append('div')
90182                   .call(uiDisclosure(context, 'community-more-' + d.id, false)
90183                       .expanded(false)
90184                       .updatePreference(false)
90185                       .title(t('success.more'))
90186                       .content(showMore)
90187                   );
90188           }
90189
90190           var nextEvents = (d.events || [])
90191               .map(function(event) {
90192                   event.date = parseEventDate(event.when);
90193                   return event;
90194               })
90195               .filter(function(event) {               // date is valid and future (or today)
90196                   var t = event.date.getTime();
90197                   var now = (new Date()).setHours(0,0,0,0);
90198                   return !isNaN(t) && t >= now;
90199               })
90200               .sort(function(a, b) {                  // sort by date ascending
90201                   return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;
90202               })
90203               .slice(0, MAXEVENTS);                   // limit number of events shown
90204
90205           if (nextEvents.length) {
90206               selection
90207                   .append('div')
90208                   .call(uiDisclosure(context, 'community-events-' + d.id, false)
90209                       .expanded(false)
90210                       .updatePreference(false)
90211                       .title(t('success.events'))
90212                       .content(showNextEvents)
90213                   )
90214                   .select('.hide-toggle')
90215                   .append('span')
90216                   .attr('class', 'badge-text')
90217                   .text(nextEvents.length);
90218           }
90219
90220
90221           function showMore(selection) {
90222               var more = selection
90223                   .append('div')
90224                   .attr('class', 'community-more');
90225
90226               if (d.extendedDescription) {
90227                   more
90228                       .append('div')
90229                       .attr('class', 'community-extended-description')
90230                       .html(t('community.' + d.id + '.extendedDescription', replacements));
90231               }
90232
90233               if (d.languageCodes && d.languageCodes.length) {
90234                   more
90235                       .append('div')
90236                       .attr('class', 'community-languages')
90237                       .text(t('success.languages', { languages: d.languageCodes.join(', ') }));
90238               }
90239           }
90240
90241
90242           function showNextEvents(selection) {
90243               var events = selection
90244                   .append('div')
90245                   .attr('class', 'community-events');
90246
90247               var item = events.selectAll('.community-event')
90248                   .data(nextEvents);
90249
90250               var itemEnter = item.enter()
90251                   .append('div')
90252                   .attr('class', 'community-event');
90253
90254               itemEnter
90255                   .append('div')
90256                   .attr('class', 'community-event-name')
90257                   .append('a')
90258                   .attr('target', '_blank')
90259                   .attr('href', function(d) { return d.url; })
90260                   .text(function(d) {
90261                       var name = d.name;
90262                       if (d.i18n && d.id) {
90263                           name = t('community.' + communityID + '.events.' + d.id + '.name', { default: name });
90264                       }
90265                       return name;
90266                   });
90267
90268               itemEnter
90269                   .append('div')
90270                   .attr('class', 'community-event-when')
90271                   .text(function(d) {
90272                       var options = {
90273                           weekday: 'short', day: 'numeric', month: 'short', year: 'numeric'
90274                       };
90275                       if (d.date.getHours() || d.date.getMinutes()) {   // include time if it has one
90276                           options.hour = 'numeric';
90277                           options.minute = 'numeric';
90278                       }
90279                       return d.date.toLocaleString(detected.locale, options);
90280                   });
90281
90282               itemEnter
90283                   .append('div')
90284                   .attr('class', 'community-event-where')
90285                   .text(function(d) {
90286                       var where = d.where;
90287                       if (d.i18n && d.id) {
90288                           where = t('community.' + communityID + '.events.' + d.id + '.where', { default: where });
90289                       }
90290                       return where;
90291                   });
90292
90293               itemEnter
90294                   .append('div')
90295                   .attr('class', 'community-event-description')
90296                   .text(function(d) {
90297                       var description = d.description;
90298                       if (d.i18n && d.id) {
90299                           description = t('community.' + communityID + '.events.' + d.id + '.description', { default: description });
90300                       }
90301                       return description;
90302                   });
90303           }
90304
90305
90306           function linkify(url, text) {
90307               text = text || url;
90308               return '<a target="_blank" href="' + url + '">' + text + '</a>';
90309           }
90310       }
90311
90312
90313       success.changeset = function(_) {
90314           if (!arguments.length) return _changeset;
90315           _changeset = _;
90316           return success;
90317       };
90318
90319
90320       success.location = function(_) {
90321           if (!arguments.length) return _location;
90322           _location = _;
90323           return success;
90324       };
90325
90326
90327       return utilRebind(success, dispatch$1, 'on');
90328   }
90329
90330   function uiViewOnKeepRight() {
90331       var _error;   // a keepright error
90332
90333
90334       function viewOnKeepRight(selection) {
90335           var url;
90336           if (services.keepRight && (_error instanceof qaError)) {
90337               url = services.keepRight.errorURL(_error);
90338           }
90339
90340           var link = selection.selectAll('.view-on-keepRight')
90341               .data(url ? [url] : []);
90342
90343           // exit
90344           link.exit()
90345               .remove();
90346
90347           // enter
90348           var linkEnter = link.enter()
90349               .append('a')
90350               .attr('class', 'view-on-keepRight')
90351               .attr('target', '_blank')
90352               .attr('href', function(d) { return d; })
90353               .call(svgIcon('#iD-icon-out-link', 'inline'));
90354
90355           linkEnter
90356               .append('span')
90357               .text(t('inspector.view_on_keepRight'));
90358       }
90359
90360
90361       viewOnKeepRight.what = function(val) {
90362           if (!arguments.length) return _error;
90363           _error = val;
90364           return viewOnKeepRight;
90365       };
90366
90367       return viewOnKeepRight;
90368   }
90369
90370   function coreHistory(context) {
90371       var dispatch$1 = dispatch('change', 'annotatedChange', 'merge', 'restore', 'undone', 'redone');
90372       var lock = utilSessionMutex('lock');
90373       var duration = 150;
90374       var _imageryUsed = [];
90375       var _checkpoints = {};
90376       var _stack;
90377       var _index;
90378       var _tree;
90379
90380
90381       // internal _act, accepts list of actions and eased time
90382       function _act(actions, t) {
90383           actions = Array.prototype.slice.call(actions);
90384
90385           var annotation;
90386           if (!isFunction(actions[actions.length - 1])) {
90387               annotation = actions.pop();
90388           }
90389
90390           var graph = _stack[_index].graph;
90391           for (var i = 0; i < actions.length; i++) {
90392               graph = actions[i](graph, t);
90393           }
90394
90395           return {
90396               graph: graph,
90397               annotation: annotation,
90398               imageryUsed: _imageryUsed,
90399               transform: context.projection.transform(),
90400               selectedIDs: context.selectedIDs()
90401           };
90402       }
90403
90404
90405       // internal _perform with eased time
90406       function _perform(args, t) {
90407           var previous = _stack[_index].graph;
90408           _stack = _stack.slice(0, _index + 1);
90409           var actionResult = _act(args, t);
90410           _stack.push(actionResult);
90411           _index++;
90412           return change(previous, actionResult.annotation);
90413       }
90414
90415
90416       // internal _replace with eased time
90417       function _replace(args, t) {
90418           var previous = _stack[_index].graph;
90419           // assert(_index == _stack.length - 1)
90420           var actionResult = _act(args, t);
90421           _stack[_index] = actionResult;
90422           return change(previous, actionResult.annotation);
90423       }
90424
90425
90426       // internal _overwrite with eased time
90427       function _overwrite(args, t) {
90428           var previous = _stack[_index].graph;
90429           if (_index > 0) {
90430               _index--;
90431               _stack.pop();
90432           }
90433           _stack = _stack.slice(0, _index + 1);
90434           var actionResult = _act(args, t);
90435           _stack.push(actionResult);
90436           _index++;
90437           return change(previous, actionResult.annotation);
90438       }
90439
90440
90441       // determine difference and dispatch a change event
90442       function change(previous, isAnnotated) {
90443           var difference = coreDifference(previous, history.graph());
90444           dispatch$1.call('change', this, difference);
90445           if (isAnnotated) {
90446               // actions like dragging a node can fire lots of changes,
90447               // so use 'annotatedChange' to listen for grouped undo/redo changes
90448               dispatch$1.call('annotatedChange', this, difference);
90449           }
90450           return difference;
90451       }
90452
90453
90454       // iD uses namespaced keys so multiple installations do not conflict
90455       function getKey(n) {
90456           return 'iD_' + window.location.origin + '_' + n;
90457       }
90458
90459
90460       var history = {
90461
90462           graph: function() {
90463               return _stack[_index].graph;
90464           },
90465
90466
90467           tree: function() {
90468               return _tree;
90469           },
90470
90471
90472           base: function() {
90473               return _stack[0].graph;
90474           },
90475
90476
90477           merge: function(entities, extent) {
90478               _stack[0].graph.rebase(entities, map$3(_stack, 'graph'), false);
90479               _tree.rebase(entities, false);
90480
90481               dispatch$1.call('change', this, undefined, extent);
90482               dispatch$1.call('merge', this, entities);
90483           },
90484
90485
90486           perform: function() {
90487               // complete any transition already in progress
90488               select(document).interrupt('history.perform');
90489
90490               var transitionable = false;
90491               var action0 = arguments[0];
90492
90493               if (arguments.length === 1 ||
90494                   arguments.length === 2 && !isFunction(arguments[1])) {
90495                   transitionable = !!action0.transitionable;
90496               }
90497
90498               if (transitionable) {
90499                   var origArguments = arguments;
90500                   select(document)
90501                       .transition('history.perform')
90502                       .duration(duration)
90503                       .ease(linear$1)
90504                       .tween('history.tween', function() {
90505                           return function(t) {
90506                               if (t < 1) _overwrite([action0], t);
90507                           };
90508                       })
90509                       .on('start', function() {
90510                           _perform([action0], 0);
90511                       })
90512                       .on('end interrupt', function() {
90513                           _overwrite(origArguments, 1);
90514                       });
90515
90516               } else {
90517                   return _perform(arguments);
90518               }
90519           },
90520
90521
90522           replace: function() {
90523               select(document).interrupt('history.perform');
90524               return _replace(arguments, 1);
90525           },
90526
90527
90528           // Same as calling pop and then perform
90529           overwrite: function() {
90530               select(document).interrupt('history.perform');
90531               return _overwrite(arguments, 1);
90532           },
90533
90534
90535           pop: function(n) {
90536               select(document).interrupt('history.perform');
90537
90538               var previous = _stack[_index].graph;
90539               if (isNaN(+n) || +n < 0) {
90540                   n = 1;
90541               }
90542               while (n-- > 0 && _index > 0) {
90543                   _index--;
90544                   _stack.pop();
90545               }
90546               return change(previous);
90547           },
90548
90549
90550           // Back to the previous annotated state or _index = 0.
90551           undo: function() {
90552               select(document).interrupt('history.perform');
90553
90554               var previous = _stack[_index].graph;
90555               while (_index > 0) {
90556                   _index--;
90557                   if (_stack[_index].annotation) break;
90558               }
90559
90560               dispatch$1.call('undone', this, _stack[_index]);
90561               return change(previous, true);
90562           },
90563
90564
90565           // Forward to the next annotated state.
90566           redo: function() {
90567               select(document).interrupt('history.perform');
90568
90569               var previous = _stack[_index].graph;
90570               var tryIndex = _index;
90571               while (tryIndex < _stack.length - 1) {
90572                   tryIndex++;
90573                   if (_stack[tryIndex].annotation) {
90574                       _index = tryIndex;
90575                       dispatch$1.call('redone', this, _stack[_index]);
90576                       break;
90577                   }
90578               }
90579
90580               return change(previous, true);
90581           },
90582
90583
90584           undoAnnotation: function() {
90585               var i = _index;
90586               while (i >= 0) {
90587                   if (_stack[i].annotation) return _stack[i].annotation;
90588                   i--;
90589               }
90590           },
90591
90592
90593           redoAnnotation: function() {
90594               var i = _index + 1;
90595               while (i <= _stack.length - 1) {
90596                   if (_stack[i].annotation) return _stack[i].annotation;
90597                   i++;
90598               }
90599           },
90600
90601
90602           intersects: function(extent) {
90603               return _tree.intersects(extent, _stack[_index].graph);
90604           },
90605
90606
90607           difference: function() {
90608               var base = _stack[0].graph;
90609               var head = _stack[_index].graph;
90610               return coreDifference(base, head);
90611           },
90612
90613
90614           changes: function(action) {
90615               var base = _stack[0].graph;
90616               var head = _stack[_index].graph;
90617
90618               if (action) {
90619                   head = action(head);
90620               }
90621
90622               var difference = coreDifference(base, head);
90623
90624               return {
90625                   modified: difference.modified(),
90626                   created: difference.created(),
90627                   deleted: difference.deleted()
90628               };
90629           },
90630
90631
90632           hasChanges: function() {
90633               return this.difference().length() > 0;
90634           },
90635
90636
90637           imageryUsed: function(sources) {
90638               if (sources) {
90639                   _imageryUsed = sources;
90640                   return history;
90641               } else {
90642                   var arr = map$3(_stack.slice(1, _index + 1), 'imageryUsed');
90643                   return without(uniq(flatten(arr)), 'Custom');
90644               }
90645           },
90646
90647
90648           // save the current history state
90649           checkpoint: function(key) {
90650               _checkpoints[key] = {
90651                   stack: cloneDeep(_stack),
90652                   index: _index
90653               };
90654               return history;
90655           },
90656
90657
90658           // restore history state to a given checkpoint or reset completely
90659           reset: function(key) {
90660               if (key !== undefined && _checkpoints.hasOwnProperty(key)) {
90661                   _stack = cloneDeep(_checkpoints[key].stack);
90662                   _index = _checkpoints[key].index;
90663               } else {
90664                   _stack = [{graph: coreGraph()}];
90665                   _index = 0;
90666                   _tree = coreTree(_stack[0].graph);
90667                   _checkpoints = {};
90668               }
90669               dispatch$1.call('change');
90670               return history;
90671           },
90672
90673
90674           toIntroGraph: function() {
90675               var nextId = { n: 0, r: 0, w: 0 };
90676               var permIds = {};
90677               var graph = this.graph();
90678               var baseEntities = {};
90679
90680               // clone base entities..
90681               forEach(graph.base().entities, function(entity) {
90682                   var copy = cloneDeepWith(entity, customizer);
90683                   baseEntities[copy.id] = copy;
90684               });
90685
90686               // replace base entities with head entities..
90687               forEach(graph.entities, function(entity, id) {
90688                   if (entity) {
90689                       var copy = cloneDeepWith(entity, customizer);
90690                       baseEntities[copy.id] = copy;
90691                   } else {
90692                       delete baseEntities[id];
90693                   }
90694               });
90695
90696               // swap temporary for permanent ids..
90697               forEach(baseEntities, function(entity) {
90698                   if (Array.isArray(entity.nodes)) {
90699                       entity.nodes = entity.nodes.map(function(node) {
90700                           return permIds[node] || node;
90701                       });
90702                   }
90703                   if (Array.isArray(entity.members)) {
90704                       entity.members = entity.members.map(function(member) {
90705                           member.id = permIds[member.id] || member.id;
90706                           return member;
90707                       });
90708                   }
90709               });
90710
90711               return JSON.stringify({ dataIntroGraph: baseEntities });
90712
90713
90714               function customizer(src) {
90715                   var copy = omit(cloneDeep(src), ['type', 'user', 'v', 'version', 'visible']);
90716                   if (isEmpty(copy.tags)) {
90717                       delete copy.tags;
90718                   }
90719
90720                   if (Array.isArray(copy.loc)) {
90721                       copy.loc[0] = +copy.loc[0].toFixed(6);
90722                       copy.loc[1] = +copy.loc[1].toFixed(6);
90723                   }
90724
90725                   var match = src.id.match(/([nrw])-\d*/);  // temporary id
90726                   if (match !== null) {
90727                       var nrw = match[1], permId;
90728                       do { permId = nrw + (++nextId[nrw]); }
90729                       while (baseEntities.hasOwnProperty(permId));
90730
90731                       copy.id = permIds[src.id] = permId;
90732                   }
90733                   return copy;
90734               }
90735           },
90736
90737
90738           toJSON: function() {
90739               if (!this.hasChanges()) return;
90740
90741               var allEntities = {};
90742               var baseEntities = {};
90743               var base = _stack[0];
90744
90745               var s = _stack.map(function(i) {
90746                   var modified = [];
90747                   var deleted = [];
90748
90749                   forEach(i.graph.entities, function(entity, id) {
90750                       if (entity) {
90751                           var key = osmEntity.key(entity);
90752                           allEntities[key] = entity;
90753                           modified.push(key);
90754                       } else {
90755                           deleted.push(id);
90756                       }
90757
90758                       // make sure that the originals of changed or deleted entities get merged
90759                       // into the base of the _stack after restoring the data from JSON.
90760                       if (id in base.graph.entities) {
90761                           baseEntities[id] = base.graph.entities[id];
90762                       }
90763                       if (entity && entity.nodes) {
90764                           // get originals of pre-existing child nodes
90765                           forEach(entity.nodes, function(nodeId) {
90766                               if (nodeId in base.graph.entities) {
90767                                   baseEntities[nodeId] = base.graph.entities[nodeId];
90768                               }
90769                           });
90770                       }
90771                       // get originals of parent entities too
90772                       forEach(base.graph._parentWays[id], function(parentId) {
90773                           if (parentId in base.graph.entities) {
90774                               baseEntities[parentId] = base.graph.entities[parentId];
90775                           }
90776                       });
90777                   });
90778
90779                   var x = {};
90780
90781                   if (modified.length) x.modified = modified;
90782                   if (deleted.length) x.deleted = deleted;
90783                   if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
90784                   if (i.annotation) x.annotation = i.annotation;
90785                   if (i.transform) x.transform = i.transform;
90786                   if (i.selectedIDs) x.selectedIDs = i.selectedIDs;
90787
90788                   return x;
90789               });
90790
90791               return JSON.stringify({
90792                   version: 3,
90793                   entities: values$1(allEntities),
90794                   baseEntities: values$1(baseEntities),
90795                   stack: s,
90796                   nextIDs: osmEntity.id.next,
90797                   index: _index
90798               });
90799           },
90800
90801
90802           fromJSON: function(json, loadChildNodes) {
90803               var h = JSON.parse(json);
90804               var loadComplete = true;
90805
90806               osmEntity.id.next = h.nextIDs;
90807               _index = h.index;
90808
90809               if (h.version === 2 || h.version === 3) {
90810                   var allEntities = {};
90811
90812                   h.entities.forEach(function(entity) {
90813                       allEntities[osmEntity.key(entity)] = osmEntity(entity);
90814                   });
90815
90816                   if (h.version === 3) {
90817                       // This merges originals for changed entities into the base of
90818                       // the _stack even if the current _stack doesn't have them (for
90819                       // example when iD has been restarted in a different region)
90820                       var baseEntities = h.baseEntities.map(function(d) { return osmEntity(d); });
90821                       _stack[0].graph.rebase(baseEntities, map$3(_stack, 'graph'), true);
90822                       _tree.rebase(baseEntities, true);
90823
90824                       // When we restore a modified way, we also need to fetch any missing
90825                       // childnodes that would normally have been downloaded with it.. #2142
90826                       if (loadChildNodes) {
90827                           var osm = context.connection();
90828                           var nodes = flatten(uniq(map$3(filter(baseEntities, { type: 'way' }), 'nodes')));
90829                           var missing = reject(nodes, function(n) { return _stack[0].graph.hasEntity(n); });
90830
90831                           if (!isEmpty(missing) && osm) {
90832                               loadComplete = false;
90833                               context.redrawEnable(false);
90834
90835                               var loading = uiLoading(context).blocking(true);
90836                               context.container().call(loading);
90837
90838                               var childNodesLoaded = function(err, result) {
90839                                   if (!err) {
90840                                       var visible = groupBy(result.data, 'visible');
90841                                       if (!isEmpty(visible.true)) {
90842                                           missing = difference(missing, map$3(visible.true, 'id'));
90843                                           _stack[0].graph.rebase(visible.true, map$3(_stack, 'graph'), true);
90844                                           _tree.rebase(visible.true, true);
90845                                       }
90846
90847                                       // fetch older versions of nodes that were deleted..
90848                                       forEach(visible.false, function(entity) {
90849                                           osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
90850                                       });
90851                                   }
90852
90853                                   if (err || isEmpty(missing)) {
90854                                       loading.close();
90855                                       context.redrawEnable(true);
90856                                       dispatch$1.call('change');
90857                                       dispatch$1.call('restore', this);
90858                                   }
90859                               };
90860
90861                               osm.loadMultiple(missing, childNodesLoaded);
90862                           }
90863                       }
90864                   }
90865
90866                   _stack = h.stack.map(function(d) {
90867                       var entities = {}, entity;
90868
90869                       if (d.modified) {
90870                           d.modified.forEach(function(key) {
90871                               entity = allEntities[key];
90872                               entities[entity.id] = entity;
90873                           });
90874                       }
90875
90876                       if (d.deleted) {
90877                           d.deleted.forEach(function(id) {
90878                               entities[id] = undefined;
90879                           });
90880                       }
90881
90882                       return {
90883                           graph: coreGraph(_stack[0].graph).load(entities),
90884                           annotation: d.annotation,
90885                           imageryUsed: d.imageryUsed,
90886                           transform: d.transform,
90887                           selectedIDs: d.selectedIDs
90888                       };
90889                   });
90890
90891               } else { // original version
90892                   _stack = h.stack.map(function(d) {
90893                       var entities = {};
90894
90895                       for (var i in d.entities) {
90896                           var entity = d.entities[i];
90897                           entities[i] = entity === 'undefined' ? undefined : osmEntity(entity);
90898                       }
90899
90900                       d.graph = coreGraph(_stack[0].graph).load(entities);
90901                       return d;
90902                   });
90903               }
90904
90905               var transform = _stack[_index].transform;
90906               if (transform) {
90907                   context.map().transformEase(transform, 0);   // 0 = immediate, no easing
90908               }
90909
90910               if (loadComplete) {
90911                   dispatch$1.call('change');
90912                   dispatch$1.call('restore', this);
90913               }
90914
90915               return history;
90916           },
90917
90918
90919           save: function() {
90920               if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
90921               return history;
90922           },
90923
90924
90925           clearSaved: function() {
90926               context.debouncedSave.cancel();
90927               if (lock.locked()) context.storage(getKey('saved_history'), null);
90928               return history;
90929           },
90930
90931
90932           lock: function() {
90933               return lock.lock();
90934           },
90935
90936
90937           unlock: function() {
90938               lock.unlock();
90939           },
90940
90941
90942           // is iD not open in another window and it detects that
90943           // there's a history stored in localStorage that's recoverable?
90944           restorableChanges: function() {
90945               return lock.locked() && !!context.storage(getKey('saved_history'));
90946           },
90947
90948
90949           // load history from a version stored in localStorage
90950           restore: function() {
90951               if (!lock.locked()) return;
90952
90953               var json = context.storage(getKey('saved_history'));
90954               if (json) history.fromJSON(json, true);
90955           },
90956
90957
90958           _getKey: getKey
90959
90960       };
90961
90962
90963       history.reset();
90964
90965       return utilRebind(history, dispatch$1, 'on');
90966   }
90967
90968   /** Used to store function metadata. */
90969   var metaMap = WeakMap && new WeakMap;
90970
90971   /**
90972    * The base implementation of `setData` without support for hot loop shorting.
90973    *
90974    * @private
90975    * @param {Function} func The function to associate metadata with.
90976    * @param {*} data The metadata.
90977    * @returns {Function} Returns `func`.
90978    */
90979   var baseSetData = !metaMap ? identity$8 : function(func, data) {
90980     metaMap.set(func, data);
90981     return func;
90982   };
90983
90984   /**
90985    * Creates a function that produces an instance of `Ctor` regardless of
90986    * whether it was invoked as part of a `new` expression or by `call` or `apply`.
90987    *
90988    * @private
90989    * @param {Function} Ctor The constructor to wrap.
90990    * @returns {Function} Returns the new wrapped function.
90991    */
90992   function createCtor(Ctor) {
90993     return function() {
90994       // Use a `switch` statement to work with class constructors. See
90995       // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
90996       // for more details.
90997       var args = arguments;
90998       switch (args.length) {
90999         case 0: return new Ctor;
91000         case 1: return new Ctor(args[0]);
91001         case 2: return new Ctor(args[0], args[1]);
91002         case 3: return new Ctor(args[0], args[1], args[2]);
91003         case 4: return new Ctor(args[0], args[1], args[2], args[3]);
91004         case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
91005         case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
91006         case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
91007       }
91008       var thisBinding = baseCreate(Ctor.prototype),
91009           result = Ctor.apply(thisBinding, args);
91010
91011       // Mimic the constructor's `return` behavior.
91012       // See https://es5.github.io/#x13.2.2 for more details.
91013       return isObject(result) ? result : thisBinding;
91014     };
91015   }
91016
91017   /** Used to compose bitmasks for function metadata. */
91018   var WRAP_BIND_FLAG = 1;
91019
91020   /**
91021    * Creates a function that wraps `func` to invoke it with the optional `this`
91022    * binding of `thisArg`.
91023    *
91024    * @private
91025    * @param {Function} func The function to wrap.
91026    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
91027    * @param {*} [thisArg] The `this` binding of `func`.
91028    * @returns {Function} Returns the new wrapped function.
91029    */
91030   function createBind(func, bitmask, thisArg) {
91031     var isBind = bitmask & WRAP_BIND_FLAG,
91032         Ctor = createCtor(func);
91033
91034     function wrapper() {
91035       var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
91036       return fn.apply(isBind ? thisArg : this, arguments);
91037     }
91038     return wrapper;
91039   }
91040
91041   /* Built-in method references for those with the same name as other `lodash` methods. */
91042   var nativeMax$5 = Math.max;
91043
91044   /**
91045    * Creates an array that is the composition of partially applied arguments,
91046    * placeholders, and provided arguments into a single array of arguments.
91047    *
91048    * @private
91049    * @param {Array} args The provided arguments.
91050    * @param {Array} partials The arguments to prepend to those provided.
91051    * @param {Array} holders The `partials` placeholder indexes.
91052    * @params {boolean} [isCurried] Specify composing for a curried function.
91053    * @returns {Array} Returns the new array of composed arguments.
91054    */
91055   function composeArgs(args, partials, holders, isCurried) {
91056     var argsIndex = -1,
91057         argsLength = args.length,
91058         holdersLength = holders.length,
91059         leftIndex = -1,
91060         leftLength = partials.length,
91061         rangeLength = nativeMax$5(argsLength - holdersLength, 0),
91062         result = Array(leftLength + rangeLength),
91063         isUncurried = !isCurried;
91064
91065     while (++leftIndex < leftLength) {
91066       result[leftIndex] = partials[leftIndex];
91067     }
91068     while (++argsIndex < holdersLength) {
91069       if (isUncurried || argsIndex < argsLength) {
91070         result[holders[argsIndex]] = args[argsIndex];
91071       }
91072     }
91073     while (rangeLength--) {
91074       result[leftIndex++] = args[argsIndex++];
91075     }
91076     return result;
91077   }
91078
91079   /* Built-in method references for those with the same name as other `lodash` methods. */
91080   var nativeMax$6 = Math.max;
91081
91082   /**
91083    * This function is like `composeArgs` except that the arguments composition
91084    * is tailored for `_.partialRight`.
91085    *
91086    * @private
91087    * @param {Array} args The provided arguments.
91088    * @param {Array} partials The arguments to append to those provided.
91089    * @param {Array} holders The `partials` placeholder indexes.
91090    * @params {boolean} [isCurried] Specify composing for a curried function.
91091    * @returns {Array} Returns the new array of composed arguments.
91092    */
91093   function composeArgsRight(args, partials, holders, isCurried) {
91094     var argsIndex = -1,
91095         argsLength = args.length,
91096         holdersIndex = -1,
91097         holdersLength = holders.length,
91098         rightIndex = -1,
91099         rightLength = partials.length,
91100         rangeLength = nativeMax$6(argsLength - holdersLength, 0),
91101         result = Array(rangeLength + rightLength),
91102         isUncurried = !isCurried;
91103
91104     while (++argsIndex < rangeLength) {
91105       result[argsIndex] = args[argsIndex];
91106     }
91107     var offset = argsIndex;
91108     while (++rightIndex < rightLength) {
91109       result[offset + rightIndex] = partials[rightIndex];
91110     }
91111     while (++holdersIndex < holdersLength) {
91112       if (isUncurried || argsIndex < argsLength) {
91113         result[offset + holders[holdersIndex]] = args[argsIndex++];
91114       }
91115     }
91116     return result;
91117   }
91118
91119   /**
91120    * Gets the number of `placeholder` occurrences in `array`.
91121    *
91122    * @private
91123    * @param {Array} array The array to inspect.
91124    * @param {*} placeholder The placeholder to search for.
91125    * @returns {number} Returns the placeholder count.
91126    */
91127   function countHolders(array, placeholder) {
91128     var length = array.length,
91129         result = 0;
91130
91131     while (length--) {
91132       if (array[length] === placeholder) {
91133         ++result;
91134       }
91135     }
91136     return result;
91137   }
91138
91139   /**
91140    * The function whose prototype chain sequence wrappers inherit from.
91141    *
91142    * @private
91143    */
91144   function baseLodash() {
91145     // No operation performed.
91146   }
91147
91148   /** Used as references for the maximum length and index of an array. */
91149   var MAX_ARRAY_LENGTH = 4294967295;
91150
91151   /**
91152    * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
91153    *
91154    * @private
91155    * @constructor
91156    * @param {*} value The value to wrap.
91157    */
91158   function LazyWrapper(value) {
91159     this.__wrapped__ = value;
91160     this.__actions__ = [];
91161     this.__dir__ = 1;
91162     this.__filtered__ = false;
91163     this.__iteratees__ = [];
91164     this.__takeCount__ = MAX_ARRAY_LENGTH;
91165     this.__views__ = [];
91166   }
91167
91168   // Ensure `LazyWrapper` is an instance of `baseLodash`.
91169   LazyWrapper.prototype = baseCreate(baseLodash.prototype);
91170   LazyWrapper.prototype.constructor = LazyWrapper;
91171
91172   /**
91173    * Gets metadata for `func`.
91174    *
91175    * @private
91176    * @param {Function} func The function to query.
91177    * @returns {*} Returns the metadata for `func`.
91178    */
91179   var getData = !metaMap ? noop$3 : function(func) {
91180     return metaMap.get(func);
91181   };
91182
91183   /** Used to lookup unminified function names. */
91184   var realNames = {};
91185
91186   /** Used for built-in method references. */
91187   var objectProto$k = Object.prototype;
91188
91189   /** Used to check objects for own properties. */
91190   var hasOwnProperty$h = objectProto$k.hasOwnProperty;
91191
91192   /**
91193    * Gets the name of `func`.
91194    *
91195    * @private
91196    * @param {Function} func The function to query.
91197    * @returns {string} Returns the function name.
91198    */
91199   function getFuncName(func) {
91200     var result = (func.name + ''),
91201         array = realNames[result],
91202         length = hasOwnProperty$h.call(realNames, result) ? array.length : 0;
91203
91204     while (length--) {
91205       var data = array[length],
91206           otherFunc = data.func;
91207       if (otherFunc == null || otherFunc == func) {
91208         return data.name;
91209       }
91210     }
91211     return result;
91212   }
91213
91214   /**
91215    * The base constructor for creating `lodash` wrapper objects.
91216    *
91217    * @private
91218    * @param {*} value The value to wrap.
91219    * @param {boolean} [chainAll] Enable explicit method chain sequences.
91220    */
91221   function LodashWrapper(value, chainAll) {
91222     this.__wrapped__ = value;
91223     this.__actions__ = [];
91224     this.__chain__ = !!chainAll;
91225     this.__index__ = 0;
91226     this.__values__ = undefined;
91227   }
91228
91229   LodashWrapper.prototype = baseCreate(baseLodash.prototype);
91230   LodashWrapper.prototype.constructor = LodashWrapper;
91231
91232   /**
91233    * Creates a clone of `wrapper`.
91234    *
91235    * @private
91236    * @param {Object} wrapper The wrapper to clone.
91237    * @returns {Object} Returns the cloned wrapper.
91238    */
91239   function wrapperClone(wrapper) {
91240     if (wrapper instanceof LazyWrapper) {
91241       return wrapper.clone();
91242     }
91243     var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
91244     result.__actions__ = copyArray(wrapper.__actions__);
91245     result.__index__  = wrapper.__index__;
91246     result.__values__ = wrapper.__values__;
91247     return result;
91248   }
91249
91250   /** Used for built-in method references. */
91251   var objectProto$l = Object.prototype;
91252
91253   /** Used to check objects for own properties. */
91254   var hasOwnProperty$i = objectProto$l.hasOwnProperty;
91255
91256   /**
91257    * Creates a `lodash` object which wraps `value` to enable implicit method
91258    * chain sequences. Methods that operate on and return arrays, collections,
91259    * and functions can be chained together. Methods that retrieve a single value
91260    * or may return a primitive value will automatically end the chain sequence
91261    * and return the unwrapped value. Otherwise, the value must be unwrapped
91262    * with `_#value`.
91263    *
91264    * Explicit chain sequences, which must be unwrapped with `_#value`, may be
91265    * enabled using `_.chain`.
91266    *
91267    * The execution of chained methods is lazy, that is, it's deferred until
91268    * `_#value` is implicitly or explicitly called.
91269    *
91270    * Lazy evaluation allows several methods to support shortcut fusion.
91271    * Shortcut fusion is an optimization to merge iteratee calls; this avoids
91272    * the creation of intermediate arrays and can greatly reduce the number of
91273    * iteratee executions. Sections of a chain sequence qualify for shortcut
91274    * fusion if the section is applied to an array and iteratees accept only
91275    * one argument. The heuristic for whether a section qualifies for shortcut
91276    * fusion is subject to change.
91277    *
91278    * Chaining is supported in custom builds as long as the `_#value` method is
91279    * directly or indirectly included in the build.
91280    *
91281    * In addition to lodash methods, wrappers have `Array` and `String` methods.
91282    *
91283    * The wrapper `Array` methods are:
91284    * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
91285    *
91286    * The wrapper `String` methods are:
91287    * `replace` and `split`
91288    *
91289    * The wrapper methods that support shortcut fusion are:
91290    * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
91291    * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
91292    * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
91293    *
91294    * The chainable wrapper methods are:
91295    * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
91296    * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
91297    * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
91298    * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
91299    * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
91300    * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
91301    * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
91302    * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
91303    * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
91304    * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
91305    * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
91306    * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
91307    * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
91308    * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
91309    * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
91310    * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
91311    * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
91312    * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
91313    * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
91314    * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
91315    * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
91316    * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
91317    * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
91318    * `zipObject`, `zipObjectDeep`, and `zipWith`
91319    *
91320    * The wrapper methods that are **not** chainable by default are:
91321    * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
91322    * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
91323    * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
91324    * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
91325    * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
91326    * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
91327    * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
91328    * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
91329    * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
91330    * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
91331    * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
91332    * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
91333    * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
91334    * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
91335    * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
91336    * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
91337    * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
91338    * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
91339    * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
91340    * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
91341    * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
91342    * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
91343    * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
91344    * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
91345    * `upperFirst`, `value`, and `words`
91346    *
91347    * @name _
91348    * @constructor
91349    * @category Seq
91350    * @param {*} value The value to wrap in a `lodash` instance.
91351    * @returns {Object} Returns the new `lodash` wrapper instance.
91352    * @example
91353    *
91354    * function square(n) {
91355    *   return n * n;
91356    * }
91357    *
91358    * var wrapped = _([1, 2, 3]);
91359    *
91360    * // Returns an unwrapped value.
91361    * wrapped.reduce(_.add);
91362    * // => 6
91363    *
91364    * // Returns a wrapped value.
91365    * var squares = wrapped.map(square);
91366    *
91367    * _.isArray(squares);
91368    * // => false
91369    *
91370    * _.isArray(squares.value());
91371    * // => true
91372    */
91373   function lodash(value) {
91374     if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
91375       if (value instanceof LodashWrapper) {
91376         return value;
91377       }
91378       if (hasOwnProperty$i.call(value, '__wrapped__')) {
91379         return wrapperClone(value);
91380       }
91381     }
91382     return new LodashWrapper(value);
91383   }
91384
91385   // Ensure wrappers are instances of `baseLodash`.
91386   lodash.prototype = baseLodash.prototype;
91387   lodash.prototype.constructor = lodash;
91388
91389   /**
91390    * Checks if `func` has a lazy counterpart.
91391    *
91392    * @private
91393    * @param {Function} func The function to check.
91394    * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
91395    *  else `false`.
91396    */
91397   function isLaziable(func) {
91398     var funcName = getFuncName(func),
91399         other = lodash[funcName];
91400
91401     if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
91402       return false;
91403     }
91404     if (func === other) {
91405       return true;
91406     }
91407     var data = getData(other);
91408     return !!data && func === data[0];
91409   }
91410
91411   /**
91412    * Sets metadata for `func`.
91413    *
91414    * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
91415    * period of time, it will trip its breaker and transition to an identity
91416    * function to avoid garbage collection pauses in V8. See
91417    * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
91418    * for more details.
91419    *
91420    * @private
91421    * @param {Function} func The function to associate metadata with.
91422    * @param {*} data The metadata.
91423    * @returns {Function} Returns `func`.
91424    */
91425   var setData = shortOut(baseSetData);
91426
91427   /** Used to match wrap detail comments. */
91428   var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
91429       reSplitDetails = /,? & /;
91430
91431   /**
91432    * Extracts wrapper details from the `source` body comment.
91433    *
91434    * @private
91435    * @param {string} source The source to inspect.
91436    * @returns {Array} Returns the wrapper details.
91437    */
91438   function getWrapDetails(source) {
91439     var match = source.match(reWrapDetails);
91440     return match ? match[1].split(reSplitDetails) : [];
91441   }
91442
91443   /** Used to match wrap detail comments. */
91444   var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;
91445
91446   /**
91447    * Inserts wrapper `details` in a comment at the top of the `source` body.
91448    *
91449    * @private
91450    * @param {string} source The source to modify.
91451    * @returns {Array} details The details to insert.
91452    * @returns {string} Returns the modified source.
91453    */
91454   function insertWrapDetails(source, details) {
91455     var length = details.length;
91456     if (!length) {
91457       return source;
91458     }
91459     var lastIndex = length - 1;
91460     details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
91461     details = details.join(length > 2 ? ', ' : ' ');
91462     return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
91463   }
91464
91465   /** Used to compose bitmasks for function metadata. */
91466   var WRAP_BIND_FLAG$1 = 1,
91467       WRAP_BIND_KEY_FLAG = 2,
91468       WRAP_CURRY_FLAG = 8,
91469       WRAP_CURRY_RIGHT_FLAG = 16,
91470       WRAP_PARTIAL_FLAG = 32,
91471       WRAP_PARTIAL_RIGHT_FLAG = 64,
91472       WRAP_ARY_FLAG = 128,
91473       WRAP_REARG_FLAG = 256,
91474       WRAP_FLIP_FLAG = 512;
91475
91476   /** Used to associate wrap methods with their bit flags. */
91477   var wrapFlags = [
91478     ['ary', WRAP_ARY_FLAG],
91479     ['bind', WRAP_BIND_FLAG$1],
91480     ['bindKey', WRAP_BIND_KEY_FLAG],
91481     ['curry', WRAP_CURRY_FLAG],
91482     ['curryRight', WRAP_CURRY_RIGHT_FLAG],
91483     ['flip', WRAP_FLIP_FLAG],
91484     ['partial', WRAP_PARTIAL_FLAG],
91485     ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
91486     ['rearg', WRAP_REARG_FLAG]
91487   ];
91488
91489   /**
91490    * Updates wrapper `details` based on `bitmask` flags.
91491    *
91492    * @private
91493    * @returns {Array} details The details to modify.
91494    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
91495    * @returns {Array} Returns `details`.
91496    */
91497   function updateWrapDetails(details, bitmask) {
91498     arrayEach(wrapFlags, function(pair) {
91499       var value = '_.' + pair[0];
91500       if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
91501         details.push(value);
91502       }
91503     });
91504     return details.sort();
91505   }
91506
91507   /**
91508    * Sets the `toString` method of `wrapper` to mimic the source of `reference`
91509    * with wrapper details in a comment at the top of the source body.
91510    *
91511    * @private
91512    * @param {Function} wrapper The function to modify.
91513    * @param {Function} reference The reference function.
91514    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
91515    * @returns {Function} Returns `wrapper`.
91516    */
91517   function setWrapToString(wrapper, reference, bitmask) {
91518     var source = (reference + '');
91519     return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
91520   }
91521
91522   /** Used to compose bitmasks for function metadata. */
91523   var WRAP_BIND_FLAG$2 = 1,
91524       WRAP_BIND_KEY_FLAG$1 = 2,
91525       WRAP_CURRY_BOUND_FLAG = 4,
91526       WRAP_CURRY_FLAG$1 = 8,
91527       WRAP_PARTIAL_FLAG$1 = 32,
91528       WRAP_PARTIAL_RIGHT_FLAG$1 = 64;
91529
91530   /**
91531    * Creates a function that wraps `func` to continue currying.
91532    *
91533    * @private
91534    * @param {Function} func The function to wrap.
91535    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
91536    * @param {Function} wrapFunc The function to create the `func` wrapper.
91537    * @param {*} placeholder The placeholder value.
91538    * @param {*} [thisArg] The `this` binding of `func`.
91539    * @param {Array} [partials] The arguments to prepend to those provided to
91540    *  the new function.
91541    * @param {Array} [holders] The `partials` placeholder indexes.
91542    * @param {Array} [argPos] The argument positions of the new function.
91543    * @param {number} [ary] The arity cap of `func`.
91544    * @param {number} [arity] The arity of `func`.
91545    * @returns {Function} Returns the new wrapped function.
91546    */
91547   function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
91548     var isCurry = bitmask & WRAP_CURRY_FLAG$1,
91549         newHolders = isCurry ? holders : undefined,
91550         newHoldersRight = isCurry ? undefined : holders,
91551         newPartials = isCurry ? partials : undefined,
91552         newPartialsRight = isCurry ? undefined : partials;
91553
91554     bitmask |= (isCurry ? WRAP_PARTIAL_FLAG$1 : WRAP_PARTIAL_RIGHT_FLAG$1);
91555     bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG$1 : WRAP_PARTIAL_FLAG$1);
91556
91557     if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
91558       bitmask &= ~(WRAP_BIND_FLAG$2 | WRAP_BIND_KEY_FLAG$1);
91559     }
91560     var newData = [
91561       func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
91562       newHoldersRight, argPos, ary, arity
91563     ];
91564
91565     var result = wrapFunc.apply(undefined, newData);
91566     if (isLaziable(func)) {
91567       setData(result, newData);
91568     }
91569     result.placeholder = placeholder;
91570     return setWrapToString(result, func, bitmask);
91571   }
91572
91573   /**
91574    * Gets the argument placeholder value for `func`.
91575    *
91576    * @private
91577    * @param {Function} func The function to inspect.
91578    * @returns {*} Returns the placeholder value.
91579    */
91580   function getHolder(func) {
91581     var object = func;
91582     return object.placeholder;
91583   }
91584
91585   /* Built-in method references for those with the same name as other `lodash` methods. */
91586   var nativeMin$2 = Math.min;
91587
91588   /**
91589    * Reorder `array` according to the specified indexes where the element at
91590    * the first index is assigned as the first element, the element at
91591    * the second index is assigned as the second element, and so on.
91592    *
91593    * @private
91594    * @param {Array} array The array to reorder.
91595    * @param {Array} indexes The arranged array indexes.
91596    * @returns {Array} Returns `array`.
91597    */
91598   function reorder(array, indexes) {
91599     var arrLength = array.length,
91600         length = nativeMin$2(indexes.length, arrLength),
91601         oldArray = copyArray(array);
91602
91603     while (length--) {
91604       var index = indexes[length];
91605       array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
91606     }
91607     return array;
91608   }
91609
91610   /** Used as the internal argument placeholder. */
91611   var PLACEHOLDER = '__lodash_placeholder__';
91612
91613   /**
91614    * Replaces all `placeholder` elements in `array` with an internal placeholder
91615    * and returns an array of their indexes.
91616    *
91617    * @private
91618    * @param {Array} array The array to modify.
91619    * @param {*} placeholder The placeholder to replace.
91620    * @returns {Array} Returns the new array of placeholder indexes.
91621    */
91622   function replaceHolders(array, placeholder) {
91623     var index = -1,
91624         length = array.length,
91625         resIndex = 0,
91626         result = [];
91627
91628     while (++index < length) {
91629       var value = array[index];
91630       if (value === placeholder || value === PLACEHOLDER) {
91631         array[index] = PLACEHOLDER;
91632         result[resIndex++] = index;
91633       }
91634     }
91635     return result;
91636   }
91637
91638   /** Used to compose bitmasks for function metadata. */
91639   var WRAP_BIND_FLAG$3 = 1,
91640       WRAP_BIND_KEY_FLAG$2 = 2,
91641       WRAP_CURRY_FLAG$2 = 8,
91642       WRAP_CURRY_RIGHT_FLAG$1 = 16,
91643       WRAP_ARY_FLAG$1 = 128,
91644       WRAP_FLIP_FLAG$1 = 512;
91645
91646   /**
91647    * Creates a function that wraps `func` to invoke it with optional `this`
91648    * binding of `thisArg`, partial application, and currying.
91649    *
91650    * @private
91651    * @param {Function|string} func The function or method name to wrap.
91652    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
91653    * @param {*} [thisArg] The `this` binding of `func`.
91654    * @param {Array} [partials] The arguments to prepend to those provided to
91655    *  the new function.
91656    * @param {Array} [holders] The `partials` placeholder indexes.
91657    * @param {Array} [partialsRight] The arguments to append to those provided
91658    *  to the new function.
91659    * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
91660    * @param {Array} [argPos] The argument positions of the new function.
91661    * @param {number} [ary] The arity cap of `func`.
91662    * @param {number} [arity] The arity of `func`.
91663    * @returns {Function} Returns the new wrapped function.
91664    */
91665   function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
91666     var isAry = bitmask & WRAP_ARY_FLAG$1,
91667         isBind = bitmask & WRAP_BIND_FLAG$3,
91668         isBindKey = bitmask & WRAP_BIND_KEY_FLAG$2,
91669         isCurried = bitmask & (WRAP_CURRY_FLAG$2 | WRAP_CURRY_RIGHT_FLAG$1),
91670         isFlip = bitmask & WRAP_FLIP_FLAG$1,
91671         Ctor = isBindKey ? undefined : createCtor(func);
91672
91673     function wrapper() {
91674       var length = arguments.length,
91675           args = Array(length),
91676           index = length;
91677
91678       while (index--) {
91679         args[index] = arguments[index];
91680       }
91681       if (isCurried) {
91682         var placeholder = getHolder(wrapper),
91683             holdersCount = countHolders(args, placeholder);
91684       }
91685       if (partials) {
91686         args = composeArgs(args, partials, holders, isCurried);
91687       }
91688       if (partialsRight) {
91689         args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
91690       }
91691       length -= holdersCount;
91692       if (isCurried && length < arity) {
91693         var newHolders = replaceHolders(args, placeholder);
91694         return createRecurry(
91695           func, bitmask, createHybrid, wrapper.placeholder, thisArg,
91696           args, newHolders, argPos, ary, arity - length
91697         );
91698       }
91699       var thisBinding = isBind ? thisArg : this,
91700           fn = isBindKey ? thisBinding[func] : func;
91701
91702       length = args.length;
91703       if (argPos) {
91704         args = reorder(args, argPos);
91705       } else if (isFlip && length > 1) {
91706         args.reverse();
91707       }
91708       if (isAry && ary < length) {
91709         args.length = ary;
91710       }
91711       if (this && this !== root$2 && this instanceof wrapper) {
91712         fn = Ctor || createCtor(fn);
91713       }
91714       return fn.apply(thisBinding, args);
91715     }
91716     return wrapper;
91717   }
91718
91719   /**
91720    * Creates a function that wraps `func` to enable currying.
91721    *
91722    * @private
91723    * @param {Function} func The function to wrap.
91724    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
91725    * @param {number} arity The arity of `func`.
91726    * @returns {Function} Returns the new wrapped function.
91727    */
91728   function createCurry(func, bitmask, arity) {
91729     var Ctor = createCtor(func);
91730
91731     function wrapper() {
91732       var length = arguments.length,
91733           args = Array(length),
91734           index = length,
91735           placeholder = getHolder(wrapper);
91736
91737       while (index--) {
91738         args[index] = arguments[index];
91739       }
91740       var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
91741         ? []
91742         : replaceHolders(args, placeholder);
91743
91744       length -= holders.length;
91745       if (length < arity) {
91746         return createRecurry(
91747           func, bitmask, createHybrid, wrapper.placeholder, undefined,
91748           args, holders, undefined, undefined, arity - length);
91749       }
91750       var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
91751       return apply(fn, this, args);
91752     }
91753     return wrapper;
91754   }
91755
91756   /** Used to compose bitmasks for function metadata. */
91757   var WRAP_BIND_FLAG$4 = 1;
91758
91759   /**
91760    * Creates a function that wraps `func` to invoke it with the `this` binding
91761    * of `thisArg` and `partials` prepended to the arguments it receives.
91762    *
91763    * @private
91764    * @param {Function} func The function to wrap.
91765    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
91766    * @param {*} thisArg The `this` binding of `func`.
91767    * @param {Array} partials The arguments to prepend to those provided to
91768    *  the new function.
91769    * @returns {Function} Returns the new wrapped function.
91770    */
91771   function createPartial(func, bitmask, thisArg, partials) {
91772     var isBind = bitmask & WRAP_BIND_FLAG$4,
91773         Ctor = createCtor(func);
91774
91775     function wrapper() {
91776       var argsIndex = -1,
91777           argsLength = arguments.length,
91778           leftIndex = -1,
91779           leftLength = partials.length,
91780           args = Array(leftLength + argsLength),
91781           fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
91782
91783       while (++leftIndex < leftLength) {
91784         args[leftIndex] = partials[leftIndex];
91785       }
91786       while (argsLength--) {
91787         args[leftIndex++] = arguments[++argsIndex];
91788       }
91789       return apply(fn, isBind ? thisArg : this, args);
91790     }
91791     return wrapper;
91792   }
91793
91794   /** Used as the internal argument placeholder. */
91795   var PLACEHOLDER$1 = '__lodash_placeholder__';
91796
91797   /** Used to compose bitmasks for function metadata. */
91798   var WRAP_BIND_FLAG$5 = 1,
91799       WRAP_BIND_KEY_FLAG$3 = 2,
91800       WRAP_CURRY_BOUND_FLAG$1 = 4,
91801       WRAP_CURRY_FLAG$3 = 8,
91802       WRAP_ARY_FLAG$2 = 128,
91803       WRAP_REARG_FLAG$1 = 256;
91804
91805   /* Built-in method references for those with the same name as other `lodash` methods. */
91806   var nativeMin$3 = Math.min;
91807
91808   /**
91809    * Merges the function metadata of `source` into `data`.
91810    *
91811    * Merging metadata reduces the number of wrappers used to invoke a function.
91812    * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
91813    * may be applied regardless of execution order. Methods like `_.ary` and
91814    * `_.rearg` modify function arguments, making the order in which they are
91815    * executed important, preventing the merging of metadata. However, we make
91816    * an exception for a safe combined case where curried functions have `_.ary`
91817    * and or `_.rearg` applied.
91818    *
91819    * @private
91820    * @param {Array} data The destination metadata.
91821    * @param {Array} source The source metadata.
91822    * @returns {Array} Returns `data`.
91823    */
91824   function mergeData(data, source) {
91825     var bitmask = data[1],
91826         srcBitmask = source[1],
91827         newBitmask = bitmask | srcBitmask,
91828         isCommon = newBitmask < (WRAP_BIND_FLAG$5 | WRAP_BIND_KEY_FLAG$3 | WRAP_ARY_FLAG$2);
91829
91830     var isCombo =
91831       ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_CURRY_FLAG$3)) ||
91832       ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_REARG_FLAG$1) && (data[7].length <= source[8])) ||
91833       ((srcBitmask == (WRAP_ARY_FLAG$2 | WRAP_REARG_FLAG$1)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG$3));
91834
91835     // Exit early if metadata can't be merged.
91836     if (!(isCommon || isCombo)) {
91837       return data;
91838     }
91839     // Use source `thisArg` if available.
91840     if (srcBitmask & WRAP_BIND_FLAG$5) {
91841       data[2] = source[2];
91842       // Set when currying a bound function.
91843       newBitmask |= bitmask & WRAP_BIND_FLAG$5 ? 0 : WRAP_CURRY_BOUND_FLAG$1;
91844     }
91845     // Compose partial arguments.
91846     var value = source[3];
91847     if (value) {
91848       var partials = data[3];
91849       data[3] = partials ? composeArgs(partials, value, source[4]) : value;
91850       data[4] = partials ? replaceHolders(data[3], PLACEHOLDER$1) : source[4];
91851     }
91852     // Compose partial right arguments.
91853     value = source[5];
91854     if (value) {
91855       partials = data[5];
91856       data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
91857       data[6] = partials ? replaceHolders(data[5], PLACEHOLDER$1) : source[6];
91858     }
91859     // Use source `argPos` if available.
91860     value = source[7];
91861     if (value) {
91862       data[7] = value;
91863     }
91864     // Use source `ary` if it's smaller.
91865     if (srcBitmask & WRAP_ARY_FLAG$2) {
91866       data[8] = data[8] == null ? source[8] : nativeMin$3(data[8], source[8]);
91867     }
91868     // Use source `arity` if one is not provided.
91869     if (data[9] == null) {
91870       data[9] = source[9];
91871     }
91872     // Use source `func` and merge bitmasks.
91873     data[0] = source[0];
91874     data[1] = newBitmask;
91875
91876     return data;
91877   }
91878
91879   /** Error message constants. */
91880   var FUNC_ERROR_TEXT$4 = 'Expected a function';
91881
91882   /** Used to compose bitmasks for function metadata. */
91883   var WRAP_BIND_FLAG$6 = 1,
91884       WRAP_BIND_KEY_FLAG$4 = 2,
91885       WRAP_CURRY_FLAG$4 = 8,
91886       WRAP_CURRY_RIGHT_FLAG$2 = 16,
91887       WRAP_PARTIAL_FLAG$2 = 32,
91888       WRAP_PARTIAL_RIGHT_FLAG$2 = 64;
91889
91890   /* Built-in method references for those with the same name as other `lodash` methods. */
91891   var nativeMax$7 = Math.max;
91892
91893   /**
91894    * Creates a function that either curries or invokes `func` with optional
91895    * `this` binding and partially applied arguments.
91896    *
91897    * @private
91898    * @param {Function|string} func The function or method name to wrap.
91899    * @param {number} bitmask The bitmask flags.
91900    *    1 - `_.bind`
91901    *    2 - `_.bindKey`
91902    *    4 - `_.curry` or `_.curryRight` of a bound function
91903    *    8 - `_.curry`
91904    *   16 - `_.curryRight`
91905    *   32 - `_.partial`
91906    *   64 - `_.partialRight`
91907    *  128 - `_.rearg`
91908    *  256 - `_.ary`
91909    *  512 - `_.flip`
91910    * @param {*} [thisArg] The `this` binding of `func`.
91911    * @param {Array} [partials] The arguments to be partially applied.
91912    * @param {Array} [holders] The `partials` placeholder indexes.
91913    * @param {Array} [argPos] The argument positions of the new function.
91914    * @param {number} [ary] The arity cap of `func`.
91915    * @param {number} [arity] The arity of `func`.
91916    * @returns {Function} Returns the new wrapped function.
91917    */
91918   function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
91919     var isBindKey = bitmask & WRAP_BIND_KEY_FLAG$4;
91920     if (!isBindKey && typeof func != 'function') {
91921       throw new TypeError(FUNC_ERROR_TEXT$4);
91922     }
91923     var length = partials ? partials.length : 0;
91924     if (!length) {
91925       bitmask &= ~(WRAP_PARTIAL_FLAG$2 | WRAP_PARTIAL_RIGHT_FLAG$2);
91926       partials = holders = undefined;
91927     }
91928     ary = ary === undefined ? ary : nativeMax$7(toInteger(ary), 0);
91929     arity = arity === undefined ? arity : toInteger(arity);
91930     length -= holders ? holders.length : 0;
91931
91932     if (bitmask & WRAP_PARTIAL_RIGHT_FLAG$2) {
91933       var partialsRight = partials,
91934           holdersRight = holders;
91935
91936       partials = holders = undefined;
91937     }
91938     var data = isBindKey ? undefined : getData(func);
91939
91940     var newData = [
91941       func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
91942       argPos, ary, arity
91943     ];
91944
91945     if (data) {
91946       mergeData(newData, data);
91947     }
91948     func = newData[0];
91949     bitmask = newData[1];
91950     thisArg = newData[2];
91951     partials = newData[3];
91952     holders = newData[4];
91953     arity = newData[9] = newData[9] === undefined
91954       ? (isBindKey ? 0 : func.length)
91955       : nativeMax$7(newData[9] - length, 0);
91956
91957     if (!arity && bitmask & (WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2)) {
91958       bitmask &= ~(WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2);
91959     }
91960     if (!bitmask || bitmask == WRAP_BIND_FLAG$6) {
91961       var result = createBind(func, bitmask, thisArg);
91962     } else if (bitmask == WRAP_CURRY_FLAG$4 || bitmask == WRAP_CURRY_RIGHT_FLAG$2) {
91963       result = createCurry(func, bitmask, arity);
91964     } else if ((bitmask == WRAP_PARTIAL_FLAG$2 || bitmask == (WRAP_BIND_FLAG$6 | WRAP_PARTIAL_FLAG$2)) && !holders.length) {
91965       result = createPartial(func, bitmask, thisArg, partials);
91966     } else {
91967       result = createHybrid.apply(undefined, newData);
91968     }
91969     var setter = data ? baseSetData : setData;
91970     return setWrapToString(setter(result, newData), func, bitmask);
91971   }
91972
91973   /** Used to compose bitmasks for function metadata. */
91974   var WRAP_BIND_FLAG$7 = 1,
91975       WRAP_PARTIAL_FLAG$3 = 32;
91976
91977   /**
91978    * Creates a function that invokes `func` with the `this` binding of `thisArg`
91979    * and `partials` prepended to the arguments it receives.
91980    *
91981    * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
91982    * may be used as a placeholder for partially applied arguments.
91983    *
91984    * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
91985    * property of bound functions.
91986    *
91987    * @static
91988    * @memberOf _
91989    * @since 0.1.0
91990    * @category Function
91991    * @param {Function} func The function to bind.
91992    * @param {*} thisArg The `this` binding of `func`.
91993    * @param {...*} [partials] The arguments to be partially applied.
91994    * @returns {Function} Returns the new bound function.
91995    * @example
91996    *
91997    * function greet(greeting, punctuation) {
91998    *   return greeting + ' ' + this.user + punctuation;
91999    * }
92000    *
92001    * var object = { 'user': 'fred' };
92002    *
92003    * var bound = _.bind(greet, object, 'hi');
92004    * bound('!');
92005    * // => 'hi fred!'
92006    *
92007    * // Bound with placeholders.
92008    * var bound = _.bind(greet, object, _, '!');
92009    * bound('hi');
92010    * // => 'hi fred!'
92011    */
92012   var bind$2 = baseRest(function(func, thisArg, partials) {
92013     var bitmask = WRAP_BIND_FLAG$7;
92014     if (partials.length) {
92015       var holders = replaceHolders(partials, getHolder(bind$2));
92016       bitmask |= WRAP_PARTIAL_FLAG$3;
92017     }
92018     return createWrap(func, bitmask, thisArg, partials, holders);
92019   });
92020
92021   // Assign default placeholders.
92022   bind$2.placeholder = {};
92023
92024   function presetCollection(collection) {
92025       var maxSearchResults = 50;
92026
92027       var presets = {
92028
92029           collection: collection,
92030
92031
92032           item: function(id) {
92033               return find$1(this.collection, function(d) {
92034                   return d.id === id;
92035               });
92036           },
92037
92038           index: function(id) {
92039               return findIndex(this.collection, function(d) {
92040                   return d.id === id;
92041               });
92042           },
92043
92044           matchGeometry: function(geometry) {
92045               return presetCollection(this.collection.filter(function(d) {
92046                   return d.matchGeometry(geometry);
92047               }));
92048           },
92049
92050
92051           search: function(value, geometry) {
92052               if (!value) return this;
92053
92054               value = value.toLowerCase();
92055
92056               // match at name beginning or just after a space (e.g. "office" -> match "Law Office")
92057               function leading(a) {
92058                   var index = a.indexOf(value);
92059                   return index === 0 || a[index - 1] === ' ';
92060               }
92061
92062               // match at name beginning only
92063               function leadingStrict(a) {
92064                   var index = a.indexOf(value);
92065                   return index === 0;
92066               }
92067
92068               function sortNames(a, b) {
92069                   var aCompare = (a.suggestion ? a.originalName : a.name()).toLowerCase();
92070                   var bCompare = (b.suggestion ? b.originalName : b.name()).toLowerCase();
92071
92072                   // priority if search string matches preset name exactly - #4325
92073                   if (value === aCompare) return -1;
92074                   if (value === bCompare) return 1;
92075
92076                   // priority for higher matchScore
92077                   var i = b.originalScore - a.originalScore;
92078                   if (i !== 0) return i;
92079
92080                   // priority if search string appears earlier in preset name
92081                   i = aCompare.indexOf(value) - bCompare.indexOf(value);
92082                   if (i !== 0) return i;
92083
92084                   // priority for shorter preset names
92085                   return aCompare.length - bCompare.length;
92086               }
92087
92088
92089               var searchable = this.collection.filter(function(a) {
92090                   return a.searchable !== false && a.suggestion !== true;
92091               });
92092               var suggestions = this.collection.filter(function(a) {
92093                   return a.suggestion === true;
92094               });
92095
92096               // matches value to preset.name
92097               var leading_name = searchable
92098                   .filter(function(a) {
92099                       return leading(a.name().toLowerCase());
92100                   }).sort(sortNames);
92101
92102               // matches value to preset.terms values
92103               var leading_terms = searchable
92104                   .filter(function(a) {
92105                       return some(a.terms() || [], leading);
92106                   });
92107
92108               // matches value to preset.tags values
92109               var leading_tag_values = searchable
92110                   .filter(function(a) {
92111                       return some(without(values$1(a.tags || {}), '*'), leading);
92112                   });
92113
92114               var leading_suggestions = suggestions
92115                   .filter(function(a) {
92116                       return leadingStrict(a.originalName.toLowerCase());
92117                   }).sort(sortNames);
92118
92119               // finds close matches to value in preset.name
92120               var similar_name = searchable
92121                   .map(function(a) {
92122                       return { preset: a, dist: utilEditDistance(value, a.name()) };
92123                   }).filter(function(a) {
92124                       return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
92125                   }).sort(function(a, b) {
92126                       return a.dist - b.dist;
92127                   }).map(function(a) {
92128                       return a.preset;
92129                   });
92130
92131               // finds close matches to value in preset.terms
92132               var similar_terms = searchable
92133                   .filter(function(a) {
92134                       return some(a.terms() || [], function(b) {
92135                           return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
92136                       });
92137                   });
92138
92139               var similar_suggestions = suggestions
92140                   .map(function(a) {
92141                       return { preset: a, dist: utilEditDistance(value, a.originalName.toLowerCase()) };
92142                   }).filter(function(a) {
92143                       return a.dist + Math.min(value.length - a.preset.originalName.length, 0) < 1;
92144                   }).sort(function(a, b) {
92145                       return a.dist - b.dist;
92146                   }).map(function(a) {
92147                       return a.preset;
92148                   });
92149
92150               var other = presets.item(geometry);
92151
92152               var results = leading_name.concat(
92153                   leading_suggestions,
92154                   leading_terms,
92155                   leading_tag_values,
92156                   similar_name,
92157                   similar_suggestions,
92158                   similar_terms
92159               ).slice(0, maxSearchResults - 1);
92160
92161               return presetCollection(uniq(results.concat(other)));
92162           }
92163       };
92164
92165
92166       return presets;
92167   }
92168
92169   function presetCategory(id, category, all) {
92170       category = clone(category);
92171
92172       category.id = id;
92173
92174
92175       category.members = presetCollection(category.members.map(function(id) {
92176           return all.item(id);
92177       }));
92178
92179
92180       category.matchGeometry = function(geometry) {
92181           return category.geometry.indexOf(geometry) >= 0;
92182       };
92183
92184
92185       category.matchScore = function() {
92186           return -1;
92187       };
92188
92189
92190       category.name = function() {
92191           return t('presets.categories.' + id + '.name', {'default': id});
92192       };
92193
92194
92195       category.terms = function() {
92196           return [];
92197       };
92198
92199
92200       return category;
92201   }
92202
92203   function presetField(id, field) {
92204       field = clone(field);
92205
92206       field.id = id;
92207
92208       // for use in classes, element ids, css selectors
92209       field.safeid = id.replace(/[^_a-zA-Z0-9\-]/g, '_');
92210
92211       field.matchGeometry = function(geometry) {
92212           return !field.geometry || field.geometry === geometry;
92213       };
92214
92215
92216       field.t = function(scope, options) {
92217           return t('presets.fields.' + id + '.' + scope, options);
92218       };
92219
92220
92221       field.label = function() {
92222           return field.overrideLabel || field.t('label', {'default': id});
92223       };
92224
92225
92226       var placeholder = field.placeholder;
92227       field.placeholder = function() {
92228           return field.t('placeholder', {'default': placeholder});
92229       };
92230
92231
92232       return field;
92233   }
92234
92235   function presetPreset(id, preset, fields, visible, rawPresets) {
92236       preset = clone(preset);
92237
92238       preset.id = id;
92239
92240       preset.parentPresetID = function() {
92241           var endIndex = preset.id.lastIndexOf('/');
92242           if (endIndex < 0) return null;
92243
92244           return preset.id.substring(0, endIndex);
92245       };
92246
92247
92248       // For a preset without fields, use the fields of the parent preset.
92249       // Replace {preset} placeholders with the fields of the specified presets.
92250       function resolveFieldInheritance() {
92251
92252           // Skip `fields` for the keys which define the preset.
92253           // These are usually `typeCombo` fields like `shop=*`
92254           function shouldInheritFieldWithID(fieldID) {
92255               var f = fields[fieldID];
92256               if (f.key) {
92257                   if (preset.tags[f.key] !== undefined &&
92258                       // inherit anyway if multiple values are allowed
92259                       f.type !== 'multiCombo' && f.type !== 'semiCombo') {
92260                       return false;
92261                   }
92262               }
92263               return true;
92264           }
92265
92266           // returns an array of field IDs to inherit from the given presetID, if found
92267           function inheritedFieldIDs(presetID, prop) {
92268               if (!presetID) return null;
92269
92270               var inheritPreset = rawPresets[presetID];
92271               if (!inheritPreset) return null;
92272
92273               var inheritFieldIDs = inheritPreset[prop] || [];
92274
92275               if (prop === 'fields') {
92276                   inheritFieldIDs = inheritFieldIDs.filter(shouldInheritFieldWithID);
92277               }
92278
92279               return inheritFieldIDs;
92280           }
92281
92282
92283           ['fields', 'moreFields'].forEach(function(prop) {
92284               var fieldIDs = [];
92285               if (preset[prop] && preset[prop].length) {    // fields were defined
92286                   preset[prop].forEach(function(fieldID) {
92287                       var match = fieldID.match(/\{(.*)\}/);
92288                       if (match !== null) {        // presetID wrapped in braces {}
92289                           var inheritIDs = inheritedFieldIDs(match[1], prop);
92290                           if (inheritIDs !== null) {
92291                               fieldIDs = fieldIDs.concat(inheritIDs);
92292                           } else {
92293                               /* eslint-disable no-console */
92294                               console.log('Cannot resolve presetID ' + match[0] +
92295                                   ' found in ' + preset.id + ' ' + prop);
92296                               /* eslint-enable no-console */
92297                           }
92298                       } else {
92299                           fieldIDs.push(fieldID);  // no braces - just a normal field
92300                       }
92301                   });
92302
92303               } else {  // no fields defined, so use the parent's if possible
92304                   fieldIDs = inheritedFieldIDs(preset.parentPresetID(), prop);
92305               }
92306               // resolve duplicate fields
92307               fieldIDs = uniq(fieldIDs);
92308
92309               // update this preset with the results
92310               preset[prop] = fieldIDs;
92311
92312               // update the raw object to allow for multiple levels of inheritance
92313               rawPresets[preset.id][prop] = fieldIDs;
92314           });
92315       }
92316
92317       if (rawPresets) {
92318           resolveFieldInheritance();
92319       }
92320
92321       preset.fields = (preset.fields || []).map(getFields);
92322       preset.moreFields = (preset.moreFields || []).map(getFields);
92323       preset.geometry = (preset.geometry || []);
92324
92325       visible = visible || false;
92326
92327       function getFields(f) {
92328           return fields[f];
92329       }
92330
92331
92332       preset.matchGeometry = function(geometry) {
92333           return preset.geometry.indexOf(geometry) >= 0;
92334       };
92335
92336
92337       preset.originalScore = preset.matchScore || 1;
92338
92339
92340       preset.matchScore = function(entity) {
92341           var tags = preset.tags;
92342           var score = 0;
92343
92344           for (var t in tags) {
92345               if (entity.tags[t] === tags[t]) {
92346                   score += preset.originalScore;
92347               } else if (tags[t] === '*' && t in entity.tags) {
92348                   score += preset.originalScore / 2;
92349               } else {
92350                   return -1;
92351               }
92352           }
92353
92354           return score;
92355       };
92356
92357
92358       preset.t = function(scope, options) {
92359           return t('presets.presets.' + id + '.' + scope, options);
92360       };
92361
92362
92363       preset.originalName = preset.name || '';
92364
92365
92366       preset.name = function() {
92367           if (preset.suggestion) {
92368               var path = id.split('/');
92369               path.pop();  // remove brand name
92370               // NOTE: insert an en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
92371               return preset.originalName + ' – ' + t('presets.presets.' + path.join('/') + '.name');
92372           }
92373           return preset.t('name', { 'default': preset.originalName });
92374       };
92375
92376
92377       preset.originalTerms = (preset.terms || []).join();
92378
92379
92380       preset.terms = function() {
92381           return preset.t('terms', { 'default': preset.originalTerms }).toLowerCase().trim().split(/\s*,+\s*/);
92382       };
92383
92384
92385       preset.isFallback = function() {
92386           var tagCount = Object.keys(preset.tags).length;
92387           return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
92388       };
92389
92390       preset.visible = function(val) {
92391           if (!arguments.length) return visible;
92392           visible = val;
92393           return visible;
92394       };
92395
92396
92397       var reference = preset.reference || {};
92398       preset.reference = function(geometry) {
92399           // Lookup documentation on Wikidata...
92400           var qid = preset.tags.wikidata || preset.tags['brand:wikidata'] || preset.tags['operator:wikidata'];
92401           if (qid) {
92402               return { qid: qid };
92403           }
92404
92405           // Lookup documentation on OSM Wikibase...
92406           var key = reference.key || Object.keys(omit(preset.tags, 'name'))[0];
92407           var value = reference.value || preset.tags[key];
92408
92409           if (geometry === 'relation' && key === 'type') {
92410               if (value in preset.tags) {
92411                   key = value;
92412                   value = preset.tags[key];
92413               } else {
92414                   return { rtype: value };
92415               }
92416           }
92417
92418           if (value === '*') {
92419               return { key: key };
92420           } else {
92421               return { key: key, value: value };
92422           }
92423       };
92424
92425
92426       preset.removeTags = preset.removeTags || preset.tags || {};
92427       preset.unsetTags = function(tags, geometry) {
92428           tags = omit(tags, Object.keys(preset.removeTags));
92429
92430           for (var f in preset.fields) {
92431               var field = preset.fields[f];
92432               if (field.matchGeometry(geometry) && field.default === tags[field.key]) {
92433                   delete tags[field.key];
92434               }
92435           }
92436
92437           delete tags.area;
92438           return tags;
92439       };
92440
92441
92442       preset.addTags = preset.addTags || preset.tags || {};
92443       preset.setTags = function(tags, geometry) {
92444           var addTags = preset.addTags;
92445           var k;
92446
92447           tags = clone(tags);
92448
92449           for (k in addTags) {
92450               if (addTags[k] === '*') {
92451                   tags[k] = 'yes';
92452               } else {
92453                   tags[k] = addTags[k];
92454               }
92455           }
92456
92457           // Add area=yes if necessary.
92458           // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
92459           // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
92460           // 2. chosen preset doesn't have a key in areaKeys (`railway=station`)
92461           if (!addTags.hasOwnProperty('area')) {
92462               delete tags.area;
92463               if (geometry === 'area') {
92464                   var needsAreaTag = true;
92465                   if (preset.geometry.indexOf('line') === -1) {
92466                       for (k in addTags) {
92467                           if (k in areaKeys) {
92468                               needsAreaTag = false;
92469                               break;
92470                           }
92471                       }
92472                   }
92473                   if (needsAreaTag) {
92474                       tags.area = 'yes';
92475                   }
92476               }
92477           }
92478
92479           for (var f in preset.fields) {
92480               var field = preset.fields[f];
92481               if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
92482                   tags[field.key] = field.default;
92483               }
92484           }
92485
92486           return tags;
92487       };
92488
92489
92490       return preset;
92491   }
92492
92493   function presetIndex() {
92494       // a presetCollection with methods for
92495       // loading new data and returning defaults
92496
92497       var all = presetCollection([]);
92498       var _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
92499       var _fields = {};
92500       var _universal = [];
92501       var _recent = presetCollection([]);
92502
92503       // Index of presets by (geometry, tag key).
92504       var _index = {
92505           point: {},
92506           vertex: {},
92507           line: {},
92508           area: {},
92509           relation: {}
92510       };
92511
92512       all.match = function(entity, resolver) {
92513           return resolver.transient(entity, 'presetMatch', function() {
92514               var geometry = entity.geometry(resolver);
92515               var address;
92516
92517               // Treat entities on addr:interpolation lines as points, not vertices - #3241
92518               if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
92519                   geometry = 'point';
92520               }
92521
92522               var geometryMatches = _index[geometry];
92523               var best = -1;
92524               var match;
92525
92526               for (var k in entity.tags) {
92527                   // If any part of an address is present,
92528                   // allow fallback to "Address" preset - #4353
92529                   if (/^addr:/.test(k) && geometryMatches['addr:*']) {
92530                       address = geometryMatches['addr:*'][0];
92531                   }
92532
92533                   var keyMatches = geometryMatches[k];
92534                   if (!keyMatches) continue;
92535
92536                   for (var i = 0; i < keyMatches.length; i++) {
92537                       var score = keyMatches[i].matchScore(entity);
92538                       if (score > best) {
92539                           best = score;
92540                           match = keyMatches[i];
92541                       }
92542                   }
92543                   
92544               }
92545
92546               if (address && (!match || match.isFallback())) {
92547                   match = address;
92548               }
92549               return match || all.item(geometry);
92550           });
92551       };
92552
92553       all.allowsVertex = function(entity, resolver) {
92554           if (entity.type !== 'node') return false;
92555           if (isEmpty(entity.tags)) return true;
92556           return resolver.transient(entity, 'vertexMatch', function() {
92557               var vertexPresets = _index.vertex;
92558               var match;
92559
92560               if (entity.isOnAddressLine(resolver)) {
92561                   match = true;
92562               } else {
92563                   for (var k in entity.tags) {
92564                       var keyMatches = vertexPresets[k];
92565                       if (!keyMatches) continue;
92566                       for (var i = 0; i < keyMatches.length; i++) {
92567                           var preset =  keyMatches[i];
92568                           if (preset.searchable !== false) {
92569                               if (preset.matchScore(entity) > -1) {
92570                                   match = preset;
92571                                   break;
92572                               }
92573                           }
92574                       }
92575
92576                       if (!match && /^addr:/.test(k) && vertexPresets['addr:*']) {
92577                           match = true;
92578                       }
92579
92580                       if (match) break;
92581
92582                   }
92583               }
92584
92585               return match;
92586           });
92587       };
92588
92589
92590       // Because of the open nature of tagging, iD will never have a complete
92591       // list of tags used in OSM, so we want it to have logic like "assume
92592       // that a closed way with an amenity tag is an area, unless the amenity
92593       // is one of these specific types". This function computes a structure
92594       // that allows testing of such conditions, based on the presets designated
92595       // as as supporting (or not supporting) the area geometry.
92596       //
92597       // The returned object L is a whitelist/blacklist of tags. A closed way
92598       // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
92599       // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
92600       // and the subkeys form the blacklist.
92601       all.areaKeys = function() {
92602           var areaKeys = {};
92603           var ignore = ['barrier', 'highway', 'footway', 'railway', 'type'];  // probably a line..
92604           var presets = reject(all.collection, 'suggestion');
92605
92606           // whitelist
92607           presets.forEach(function(d) {
92608               for (var key in d.tags) break;
92609               if (!key) return;
92610               if (ignore.indexOf(key) !== -1) return;
92611
92612               if (d.geometry.indexOf('area') !== -1) {    // probably an area..
92613                   areaKeys[key] = areaKeys[key] || {};
92614               }
92615           });
92616
92617           // blacklist
92618           presets.forEach(function(d) {
92619               for (var key in d.tags) break;
92620               if (!key) return;
92621               if (ignore.indexOf(key) !== -1) return;
92622
92623               var value = d.tags[key];
92624               if (key in areaKeys &&                      // probably an area...
92625                   d.geometry.indexOf('line') !== -1 &&    // but sometimes a line
92626                   value !== '*') {
92627                   areaKeys[key][value] = true;
92628               }
92629           });
92630
92631           return areaKeys;
92632       };
92633
92634       all.build = function(d, visible) {
92635           if (d.fields) {
92636               forEach(d.fields, function(d, id) {
92637                   _fields[id] = presetField(id, d);
92638                   if (d.universal) {
92639                       _universal.push(_fields[id]);
92640                   }
92641               });
92642           }
92643
92644           if (d.presets) {
92645               var rawPresets = d.presets;
92646               forEach(d.presets, function(d, id) {
92647                   var existing = all.index(id);
92648                   if (existing !== -1) {
92649                       all.collection[existing] = presetPreset(id, d, _fields, visible, rawPresets);
92650                   } else {
92651                       all.collection.push(presetPreset(id, d, _fields, visible, rawPresets));
92652                   }
92653               });
92654           }
92655
92656           if (d.categories) {
92657               forEach(d.categories, function(d, id) {
92658                   var existing = all.index(id);
92659                   if (existing !== -1) {
92660                       all.collection[existing] = presetCategory(id, d, all);
92661                   } else {
92662                       all.collection.push(presetCategory(id, d, all));
92663                   }
92664               });
92665           }
92666
92667           if (d.defaults) {
92668               var getItem = bind$2(all.item, all);
92669               _defaults = {
92670                   area: presetCollection(d.defaults.area.map(getItem)),
92671                   line: presetCollection(d.defaults.line.map(getItem)),
92672                   point: presetCollection(d.defaults.point.map(getItem)),
92673                   vertex: presetCollection(d.defaults.vertex.map(getItem)),
92674                   relation: presetCollection(d.defaults.relation.map(getItem))
92675               };
92676           }
92677
92678           for (var i = 0; i < all.collection.length; i++) {
92679               var preset = all.collection[i];
92680               var geometry = preset.geometry;
92681
92682               for (var j = 0; j < geometry.length; j++) {
92683                   var g = _index[geometry[j]];
92684                   for (var k in preset.tags) {
92685                       (g[k] = g[k] || []).push(preset);
92686                   }
92687               }
92688           }
92689           return all;
92690       };
92691
92692       all.init = function() {
92693           all.collection = [];
92694           _recent.collection = [];
92695           _fields = {};
92696           _universal = [];
92697           _index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
92698
92699           return all.build(data.presets, true);
92700       };
92701
92702
92703       all.reset = function() {
92704           all.collection = [];
92705           _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
92706           _fields = {};
92707           _universal = [];
92708           _recent = presetCollection([]);
92709
92710           // Index of presets by (geometry, tag key).
92711           _index = {
92712               point: {},
92713               vertex: {},
92714               line: {},
92715               area: {},
92716               relation: {}
92717           };
92718
92719           return all;
92720       };
92721
92722       all.fromExternal = function(external, done) {
92723           all.reset();
92724           d3_json(external, function(err, externalPresets) {
92725               if (err) {
92726                   all.init();
92727               } else {
92728                   all.build(data.presets, false); // make default presets hidden to begin
92729                   all.build(externalPresets, true); // make the external visible
92730               }
92731               done(all);
92732           });
92733       };
92734
92735       all.field = function(id) {
92736           return _fields[id];
92737       };
92738
92739       all.universal = function() {
92740           return _universal;
92741       };
92742
92743       all.defaults = function(geometry, n) {
92744           var rec = _recent.matchGeometry(geometry).collection.slice(0, 4);
92745           var def = uniq(rec.concat(_defaults[geometry].collection)).slice(0, n - 1);
92746           return presetCollection(uniq(rec.concat(def).concat(all.item(geometry))));
92747       };
92748
92749       all.choose = function(preset) {
92750           if (preset.searchable !== false) {
92751               _recent = presetCollection(uniq([preset].concat(_recent.collection)));
92752           }
92753           return all;
92754       };
92755
92756       return all;
92757   }
92758
92759   var areaKeys = {};
92760
92761   function setAreaKeys(value) {
92762       areaKeys = value;
92763   }
92764
92765
92766   function coreContext() {
92767       var context = {};
92768       context.version = '2.14.0';
92769
92770       // create a special translation that contains the keys in place of the strings
92771       var tkeys = cloneDeep(en);
92772       var parents = [];
92773
92774       function traverser(v, k, obj) {
92775           parents.push(k);
92776           if (isObject(v)) {
92777               forOwn(v, traverser);
92778           } else if (isString(v)) {
92779               obj[k] = parents.join('.');
92780           }
92781           parents.pop();
92782       }
92783
92784       forOwn(tkeys, traverser);
92785       addTranslation('_tkeys_', tkeys);
92786
92787       addTranslation('en', en);
92788       setLocale('en');
92789
92790       var dispatch$1 = dispatch('enter', 'exit', 'change');
92791
92792       // https://github.com/openstreetmap/iD/issues/772
92793       // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
92794       var storage;
92795       try { storage = localStorage; } catch (e) {}  // eslint-disable-line no-empty
92796       storage = storage || (function() {
92797           var s = {};
92798           return {
92799               getItem: function(k) { return s[k]; },
92800               setItem: function(k, v) { s[k] = v; },
92801               removeItem: function(k) { delete s[k]; }
92802           };
92803       })();
92804
92805       context.storage = function(k, v) {
92806           try {
92807               if (arguments.length === 1) return storage.getItem(k);
92808               else if (v === null) storage.removeItem(k);
92809               else storage.setItem(k, v);
92810           } catch (e) {
92811               // localstorage quota exceeded
92812               /* eslint-disable no-console */
92813               if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
92814               /* eslint-enable no-console */
92815           }
92816       };
92817
92818
92819       /* User interface and keybinding */
92820       var ui;
92821       context.ui = function() { return ui; };
92822
92823       var keybinding = utilKeybinding('context');
92824       context.keybinding = function() { return keybinding; };
92825       select(document).call(keybinding);
92826
92827
92828       /* Straight accessors. Avoid using these if you can. */
92829       var connection, history, validator;
92830       context.connection = function() { return connection; };
92831       context.history = function() { return history; };
92832       context.validator = function() { return validator; };
92833
92834       /* Connection */
92835       context.preauth = function(options) {
92836           if (connection) {
92837               connection.switch(options);
92838           }
92839           return context;
92840       };
92841
92842       context.loadTiles = utilCallWhenIdle(function(projection, callback) {
92843           var cid;
92844           function done(err, result) {
92845               if (connection.getConnectionId() !== cid) {
92846                   if (callback) callback({ message: 'Connection Switched', status: -1 });
92847                   return;
92848               }
92849               if (!err) history.merge(result.data, result.extent);
92850               if (callback) callback(err, result);
92851           }
92852           if (connection && context.editable()) {
92853               cid = connection.getConnectionId();
92854               connection.loadTiles(projection, done);
92855           }
92856       });
92857
92858       context.loadEntity = function(entityID, callback) {
92859           var cid;
92860           function done(err, result) {
92861               if (connection.getConnectionId() !== cid) {
92862                   if (callback) callback({ message: 'Connection Switched', status: -1 });
92863                   return;
92864               }
92865               if (!err) history.merge(result.data, result.extent);
92866               if (callback) callback(err, result);
92867           }
92868           if (connection) {
92869               cid = connection.getConnectionId();
92870               connection.loadEntity(entityID, done);
92871           }
92872       };
92873
92874       context.zoomToEntity = function(entityID, zoomTo) {
92875           if (zoomTo !== false) {
92876               this.loadEntity(entityID, function(err, result) {
92877                   if (err) return;
92878                   var entity = find$1(result.data, function(e) { return e.id === entityID; });
92879                   if (entity) {
92880                       map.zoomTo(entity);
92881                   }
92882               });
92883           }
92884
92885           map.on('drawn.zoomToEntity', function() {
92886               if (!context.hasEntity(entityID)) return;
92887               map.on('drawn.zoomToEntity', null);
92888               context.on('enter.zoomToEntity', null);
92889               context.enter(modeSelect(context, [entityID]));
92890           });
92891
92892           context.on('enter.zoomToEntity', function() {
92893               if (mode.id !== 'browse') {
92894                   map.on('drawn.zoomToEntity', null);
92895                   context.on('enter.zoomToEntity', null);
92896               }
92897           });
92898       };
92899
92900       var minEditableZoom = 16;
92901       context.minEditableZoom = function(_) {
92902           if (!arguments.length) return minEditableZoom;
92903           minEditableZoom = _;
92904           if (connection) {
92905               connection.tileZoom(_);
92906           }
92907           return context;
92908       };
92909
92910
92911       /* History */
92912       var inIntro = false;
92913       context.inIntro = function(_) {
92914           if (!arguments.length) return inIntro;
92915           inIntro = _;
92916           return context;
92917       };
92918
92919       context.save = function() {
92920           // no history save, no message onbeforeunload
92921           if (inIntro || select('.modal').size()) return;
92922
92923           var canSave;
92924           if (mode && mode.id === 'save') {
92925               canSave = false;
92926
92927               // Attempt to prevent user from creating duplicate changes - see #5200
92928               if (services.osm && services.osm.isChangesetInflight()) {
92929                   history.clearSaved();
92930                   return;
92931               }
92932
92933           } else {
92934               canSave = context.selectedIDs().every(function(id) {
92935                   var entity = context.hasEntity(id);
92936                   return entity && !entity.isDegenerate();
92937               });
92938           }
92939
92940           if (canSave) {
92941               history.save();
92942           }
92943           if (history.hasChanges()) {
92944               return t('save.unsaved_changes');
92945           }
92946       };
92947
92948
92949       /* Graph */
92950       context.hasEntity = function(id) {
92951           return history.graph().hasEntity(id);
92952       };
92953       context.entity = function(id) {
92954           return history.graph().entity(id);
92955       };
92956       context.childNodes = function(way) {
92957           return history.graph().childNodes(way);
92958       };
92959       context.geometry = function(id) {
92960           return context.entity(id).geometry(history.graph());
92961       };
92962
92963
92964       /* Modes */
92965       var mode;
92966       context.mode = function() {
92967           return mode;
92968       };
92969       context.enter = function(newMode) {
92970           if (mode) {
92971               mode.exit();
92972               dispatch$1.call('exit', this, mode);
92973           }
92974
92975           mode = newMode;
92976           mode.enter();
92977           dispatch$1.call('enter', this, mode);
92978       };
92979
92980       context.selectedIDs = function() {
92981           if (mode && mode.selectedIDs) {
92982               return mode.selectedIDs();
92983           } else {
92984               return [];
92985           }
92986       };
92987
92988       context.activeID = function() {
92989           return mode && mode.activeID && mode.activeID();
92990       };
92991
92992       var _selectedNoteID;
92993       context.selectedNoteID = function(noteID) {
92994           if (!arguments.length) return _selectedNoteID;
92995           _selectedNoteID = noteID;
92996           return context;
92997       };
92998
92999       var _selectedErrorID;
93000       context.selectedErrorID = function(errorID) {
93001           if (!arguments.length) return _selectedErrorID;
93002           _selectedErrorID = errorID;
93003           return context;
93004       };
93005
93006
93007       /* Behaviors */
93008       context.install = function(behavior) {
93009           context.surface().call(behavior);
93010       };
93011       context.uninstall = function(behavior) {
93012           context.surface().call(behavior.off);
93013       };
93014
93015
93016       /* Copy/Paste */
93017       var copyIDs = [], copyGraph;
93018       context.copyGraph = function() { return copyGraph; };
93019       context.copyIDs = function(_) {
93020           if (!arguments.length) return copyIDs;
93021           copyIDs = _;
93022           copyGraph = history.graph();
93023           return context;
93024       };
93025
93026
93027       /* Background */
93028       var background;
93029       context.background = function() { return background; };
93030
93031
93032       /* Features */
93033       var features;
93034       context.features = function() { return features; };
93035       context.hasHiddenConnections = function(id) {
93036           var graph = history.graph(),
93037               entity = graph.entity(id);
93038           return features.hasHiddenConnections(entity, graph);
93039       };
93040
93041
93042       /* Presets */
93043       var presets;
93044       context.presets = function() { return presets; };
93045
93046
93047       /* Map */
93048       var map;
93049       context.map = function() { return map; };
93050       context.layers = function() { return map.layers; };
93051       context.surface = function() { return map.surface; };
93052       context.editable = function() { return map.editable(); };
93053       context.surfaceRect = function() {
93054           return map.surface.node().getBoundingClientRect();
93055       };
93056
93057
93058       /* Debug */
93059       var debugFlags = {
93060           tile: false,        // tile boundaries
93061           collision: false,   // label collision bounding boxes
93062           imagery: false,     // imagery bounding polygons
93063           community: false,   // community bounding polygons
93064           imperial: false,    // imperial (not metric) bounding polygons
93065           driveLeft: false,   // driveLeft bounding polygons
93066           target: false       // touch targets
93067       };
93068       context.debugFlags = function() {
93069           return debugFlags;
93070       };
93071       context.setDebug = function(flag, val) {
93072           if (arguments.length === 1) val = true;
93073           debugFlags[flag] = val;
93074           dispatch$1.call('change');
93075           return context;
93076       };
93077       context.getDebug = function(flag) {
93078           return flag && debugFlags[flag];
93079       };
93080
93081
93082       /* Container */
93083       var container = select(document.body);
93084       context.container = function(_) {
93085           if (!arguments.length) return container;
93086           container = _;
93087           container.classed('id-container', true);
93088           return context;
93089       };
93090       var embed;
93091       context.embed = function(_) {
93092           if (!arguments.length) return embed;
93093           embed = _;
93094           return context;
93095       };
93096
93097
93098       /* Assets */
93099       var assetPath = '';
93100       context.assetPath = function(_) {
93101           if (!arguments.length) return assetPath;
93102           assetPath = _;
93103           return context;
93104       };
93105
93106       var assetMap = {};
93107       context.assetMap = function(_) {
93108           if (!arguments.length) return assetMap;
93109           assetMap = _;
93110           return context;
93111       };
93112
93113       context.asset = function(_) {
93114           var filename = assetPath + _;
93115           return assetMap[filename] || filename;
93116       };
93117
93118       context.imagePath = function(_) {
93119           return context.asset('img/' + _);
93120       };
93121
93122
93123       /* locales */
93124       // `locale` variable contains a "requested locale".
93125       // It won't become the `currentLocale` until after loadLocale() is called.
93126       var locale, localePath;
93127
93128       context.locale = function(loc, path) {
93129           if (!arguments.length) return currentLocale;
93130           locale = loc;
93131           localePath = path;
93132           return context;
93133       };
93134
93135       context.loadLocale = function(callback) {
93136           if (locale && locale !== 'en' && dataLocales.hasOwnProperty(locale)) {
93137               localePath = localePath || context.asset('locales/' + locale + '.json');
93138               d3_json(localePath, function(err, result) {
93139                   if (!err) {
93140                       addTranslation(locale, result[locale]);
93141                       setLocale(locale);
93142                       utilDetect(true);
93143                   }
93144                   if (callback) {
93145                       callback(err);
93146                   }
93147               });
93148           } else {
93149               if (locale) {
93150                   setLocale(locale);
93151                   utilDetect(true);
93152               }
93153               if (callback) {
93154                   callback();
93155               }
93156           }
93157       };
93158
93159
93160       /* reset (aka flush) */
93161       context.reset = context.flush = function() {
93162           context.debouncedSave.cancel();
93163           forEach(services, function(service) {
93164               if (service && typeof service.reset === 'function') {
93165                   service.reset(context);
93166               }
93167           });
93168           features.reset();
93169           history.reset();
93170           return context;
93171       };
93172
93173
93174       /* Init */
93175
93176       context.projection = geoRawMercator();
93177       context.curtainProjection = geoRawMercator();
93178
93179       locale = utilDetect().locale;
93180       if (locale && !dataLocales.hasOwnProperty(locale)) {
93181           locale = locale.split('-')[0];
93182       }
93183
93184       history = coreHistory(context);
93185
93186       context.graph = history.graph;
93187       context.changes = history.changes;
93188       context.intersects = history.intersects;
93189
93190       validator = coreValidator(context);
93191
93192       // run validation upon restoring from page reload
93193       history.on('restore', function() {
93194           validator.validate();
93195       });
93196       // re-run validation upon a significant graph change
93197       history.on('annotatedChange', function(difference) {
93198           if (difference) {
93199               validator.validate();
93200           }
93201       });
93202       // re-run validation upon merging fetched data
93203       history.on('merge', function(entities) {
93204           if (entities && entities.length > 0) {
93205               validator.validate();
93206           }
93207       });
93208
93209       // Debounce save, since it's a synchronous localStorage write,
93210       // and history changes can happen frequently (e.g. when dragging).
93211       context.debouncedSave = debounce(context.save, 350);
93212       function withDebouncedSave(fn) {
93213           return function() {
93214               var result = fn.apply(history, arguments);
93215               context.debouncedSave();
93216               return result;
93217           };
93218       }
93219
93220       context.perform = withDebouncedSave(history.perform);
93221       context.replace = withDebouncedSave(history.replace);
93222       context.pop = withDebouncedSave(history.pop);
93223       context.overwrite = withDebouncedSave(history.overwrite);
93224       context.undo = withDebouncedSave(history.undo);
93225       context.redo = withDebouncedSave(history.redo);
93226
93227       ui = uiInit(context);
93228
93229       connection = services.osm;
93230       background = rendererBackground(context);
93231       features = rendererFeatures(context);
93232       presets = presetIndex();
93233
93234       if (services.maprules && utilStringQs(window.location.hash).maprules) {
93235           var maprules = utilStringQs(window.location.hash).maprules;
93236           d3_json(maprules, function (err, mapcss) {
93237               if (err) return;
93238               services.maprules.init();
93239               forEach(mapcss, function(mapcssSelector) {
93240                   return services.maprules.addRule(mapcssSelector);
93241               });
93242           });
93243       }
93244
93245       map = rendererMap(context);
93246       context.mouse = map.mouse;
93247       context.extent = map.extent;
93248       context.pan = map.pan;
93249       context.zoomIn = map.zoomIn;
93250       context.zoomOut = map.zoomOut;
93251       context.zoomInFurther = map.zoomInFurther;
93252       context.zoomOutFurther = map.zoomOutFurther;
93253       context.redrawEnable = map.redrawEnable;
93254
93255       forEach(services, function(service) {
93256           if (service && typeof service.init === 'function') {
93257               service.init(context);
93258           }
93259       });
93260
93261       background.init();
93262       features.init();
93263       if (utilStringQs(window.location.hash).presets) {
93264           var external = utilStringQs(window.location.hash).presets;
93265           presets.fromExternal(external, function(externalPresets) {
93266               context.presets = function() { return externalPresets; }; // default + external presets...
93267               areaKeys = presets.areaKeys();
93268           });
93269       } else {
93270           presets.init();
93271           areaKeys = presets.areaKeys();
93272       }
93273
93274       return utilRebind(context, dispatch$1, 'on');
93275   }
93276
93277   function osmWay() {
93278       if (!(this instanceof osmWay)) {
93279           return (new osmWay()).initialize(arguments);
93280       } else if (arguments.length) {
93281           this.initialize(arguments);
93282       }
93283   }
93284
93285
93286   osmEntity.way = osmWay;
93287
93288   osmWay.prototype = Object.create(osmEntity.prototype);
93289
93290
93291   assignIn(osmWay.prototype, {
93292       type: 'way',
93293       nodes: [],
93294
93295
93296       copy: function(resolver, copies) {
93297           if (copies[this.id]) return copies[this.id];
93298
93299           var copy = osmEntity.prototype.copy.call(this, resolver, copies);
93300
93301           var nodes = this.nodes.map(function(id) {
93302               return resolver.entity(id).copy(resolver, copies).id;
93303           });
93304
93305           copy = copy.update({ nodes: nodes });
93306           copies[this.id] = copy;
93307
93308           return copy;
93309       },
93310
93311
93312       extent: function(resolver) {
93313           return resolver.transient(this, 'extent', function() {
93314               var extent = geoExtent();
93315               for (var i = 0; i < this.nodes.length; i++) {
93316                   var node = resolver.hasEntity(this.nodes[i]);
93317                   if (node) {
93318                       extent._extend(node.extent());
93319                   }
93320               }
93321               return extent;
93322           });
93323       },
93324
93325
93326       first: function() {
93327           return this.nodes[0];
93328       },
93329
93330
93331       last: function() {
93332           return this.nodes[this.nodes.length - 1];
93333       },
93334
93335
93336       contains: function(node) {
93337           return this.nodes.indexOf(node) >= 0;
93338       },
93339
93340
93341       affix: function(node) {
93342           if (this.nodes[0] === node) return 'prefix';
93343           if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
93344       },
93345
93346
93347       layer: function() {
93348           // explicit layer tag, clamp between -10, 10..
93349           if (isFinite(this.tags.layer)) {
93350               return Math.max(-10, Math.min(+(this.tags.layer), 10));
93351           }
93352
93353           // implied layer tag..
93354           if (this.tags.covered === 'yes') return -1;
93355           if (this.tags.location === 'overground') return 1;
93356           if (this.tags.location === 'underground') return -1;
93357           if (this.tags.location === 'underwater') return -10;
93358
93359           if (this.tags.power === 'line') return 10;
93360           if (this.tags.power === 'minor_line') return 10;
93361           if (this.tags.aerialway) return 10;
93362           if (this.tags.bridge) return 1;
93363           if (this.tags.cutting) return -1;
93364           if (this.tags.tunnel) return -1;
93365           if (this.tags.waterway) return -1;
93366           if (this.tags.man_made === 'pipeline') return -10;
93367           if (this.tags.boundary) return -10;
93368           return 0;
93369       },
93370
93371
93372       isOneWay: function() {
93373           // explicit oneway tag..
93374           var values = {
93375               'yes': true,
93376               '1': true,
93377               '-1': true,
93378               'reversible': true,
93379               'alternating': true,
93380               'no': false,
93381               '0': false
93382           };
93383           if (values[this.tags.oneway] !== undefined) {
93384               return values[this.tags.oneway];
93385           }
93386
93387           // implied oneway tag..
93388           for (var key in this.tags) {
93389               if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
93390                   return true;
93391           }
93392           return false;
93393       },
93394
93395       // Some identifier for tag that implies that this way is "sided",
93396       // i.e. the right side is the 'inside' (e.g. the right side of a
93397       // natural=cliff is lower).
93398       sidednessIdentifier: function() {
93399           for (var key in this.tags) {
93400               var value = this.tags[key];
93401               if (key in osmRightSideIsInsideTags && (value in osmRightSideIsInsideTags[key])) {
93402                   if (osmRightSideIsInsideTags[key][value] === true) {
93403                       return key;
93404                   } else {
93405                       // if the map's value is something other than a
93406                       // literal true, we should use it so we can
93407                       // special case some keys (e.g. natural=coastline
93408                       // is handled differently to other naturals).
93409                       return osmRightSideIsInsideTags[key][value];
93410                   }
93411               }
93412           }
93413
93414           return null;
93415       },
93416       isSided: function() {
93417           if (this.tags.two_sided === 'yes') {
93418               return false;
93419           }
93420
93421           return this.sidednessIdentifier() != null;
93422       },
93423
93424       lanes: function() {
93425           return osmLanes(this);
93426       },
93427
93428
93429       isClosed: function() {
93430           return this.nodes.length > 1 && this.first() === this.last();
93431       },
93432
93433
93434       isConvex: function(resolver) {
93435           if (!this.isClosed() || this.isDegenerate()) return null;
93436
93437           var nodes = uniq(resolver.childNodes(this));
93438           var coords = map$3(nodes, 'loc');
93439           var curr = 0;
93440           var prev = 0;
93441
93442           for (var i = 0; i < coords.length; i++) {
93443               var o = coords[(i+1) % coords.length];
93444               var a = coords[i];
93445               var b = coords[(i+2) % coords.length];
93446               var res = geoVecCross(a, b, o);
93447
93448               curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
93449               if (curr === 0) {
93450                   continue;
93451               } else if (prev && curr !== prev) {
93452                   return false;
93453               }
93454               prev = curr;
93455           }
93456           return true;
93457       },
93458
93459       // returns an objects with the tag that implies this is an area, if any
93460       tagSuggestingArea: function() {
93461
93462           if (this.tags.area === 'yes') return { area: 'yes' };
93463           if (this.tags.area === 'no') return null;
93464
93465           // `highway` and `railway` are typically linear features, but there
93466           // are a few exceptions that should be treated as areas, even in the
93467           // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
93468           var lineKeys = {
93469               highway: {
93470                   rest_area: true,
93471                   services: true
93472               },
93473               railway: {
93474                   roundhouse: true,
93475                   station: true,
93476                   traverser: true,
93477                   turntable: true,
93478                   wash: true
93479               }
93480           };
93481           var returnTags = {};
93482           for (var key in this.tags) {
93483               if (key in areaKeys && !(this.tags[key] in areaKeys[key])) {
93484                   returnTags[key] = this.tags[key];
93485                   return returnTags;
93486               }
93487               if (key in lineKeys && this.tags[key] in lineKeys[key]) {
93488                   returnTags[key] = this.tags[key];
93489                   return returnTags;
93490               }
93491           }
93492           return null;
93493       },
93494
93495       isArea: function() {
93496
93497           if (this.tags.area === 'yes')
93498               return true;
93499           if (!this.isClosed() || this.tags.area === 'no')
93500               return false;
93501           return this.tagSuggestingArea() !== null;
93502       },
93503
93504
93505       isDegenerate: function() {
93506           return uniq(this.nodes).length < (this.isArea() ? 3 : 2);
93507       },
93508
93509
93510       areAdjacent: function(n1, n2) {
93511           for (var i = 0; i < this.nodes.length; i++) {
93512               if (this.nodes[i] === n1) {
93513                   if (this.nodes[i - 1] === n2) return true;
93514                   if (this.nodes[i + 1] === n2) return true;
93515               }
93516           }
93517           return false;
93518       },
93519
93520
93521       geometry: function(graph) {
93522           return graph.transient(this, 'geometry', function() {
93523               return this.isArea() ? 'area' : 'line';
93524           });
93525       },
93526
93527
93528       // If this way is not closed, append the beginning node to the end of the nodelist to close it.
93529       close: function() {
93530           if (this.isClosed() || !this.nodes.length) return this;
93531
93532           var nodes = this.nodes.slice();
93533           nodes = nodes.filter(noRepeatNodes);
93534           nodes.push(nodes[0]);
93535           return this.update({ nodes: nodes });
93536       },
93537
93538
93539       // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
93540       unclose: function() {
93541           if (!this.isClosed()) return this;
93542
93543           var nodes = this.nodes.slice();
93544           var connector = this.first();
93545           var i = nodes.length - 1;
93546
93547           // remove trailing connectors..
93548           while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
93549               nodes.splice(i, 1);
93550               i = nodes.length - 1;
93551           }
93552
93553           nodes = nodes.filter(noRepeatNodes);
93554           return this.update({ nodes: nodes });
93555       },
93556
93557
93558       // Adds a node (id) in front of the node which is currently at position index.
93559       // If index is undefined, the node will be added to the end of the way for linear ways,
93560       //   or just before the final connecting node for circular ways.
93561       // Consecutive duplicates are eliminated including existing ones.
93562       // Circularity is always preserved when adding a node.
93563       addNode: function(id, index) {
93564           var nodes = this.nodes.slice();
93565           var isClosed = this.isClosed();
93566           var max = isClosed ? nodes.length - 1 : nodes.length;
93567
93568           if (index === undefined) {
93569               index = max;
93570           }
93571
93572           if (index < 0 || index > max) {
93573               throw new RangeError('index ' + index + ' out of range 0..' + max);
93574           }
93575
93576           // If this is a closed way, remove all connector nodes except the first one
93577           // (there may be duplicates) and adjust index if necessary..
93578           if (isClosed) {
93579               var connector = this.first();
93580
93581               // leading connectors..
93582               var i = 1;
93583               while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
93584                   nodes.splice(i, 1);
93585                   if (index > i) index--;
93586               }
93587
93588               // trailing connectors..
93589               i = nodes.length - 1;
93590               while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
93591                   nodes.splice(i, 1);
93592                   if (index > i) index--;
93593                   i = nodes.length - 1;
93594               }
93595           }
93596
93597           nodes.splice(index, 0, id);
93598           nodes = nodes.filter(noRepeatNodes);
93599
93600           // If the way was closed before, append a connector node to keep it closed..
93601           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
93602               nodes.push(nodes[0]);
93603           }
93604
93605           return this.update({ nodes: nodes });
93606       },
93607
93608
93609       // Replaces the node which is currently at position index with the given node (id).
93610       // Consecutive duplicates are eliminated including existing ones.
93611       // Circularity is preserved when updating a node.
93612       updateNode: function(id, index) {
93613           var nodes = this.nodes.slice();
93614           var isClosed = this.isClosed();
93615           var max = nodes.length - 1;
93616
93617           if (index === undefined || index < 0 || index > max) {
93618               throw new RangeError('index ' + index + ' out of range 0..' + max);
93619           }
93620
93621           // If this is a closed way, remove all connector nodes except the first one
93622           // (there may be duplicates) and adjust index if necessary..
93623           if (isClosed) {
93624               var connector = this.first();
93625
93626               // leading connectors..
93627               var i = 1;
93628               while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
93629                   nodes.splice(i, 1);
93630                   if (index > i) index--;
93631               }
93632
93633               // trailing connectors..
93634               i = nodes.length - 1;
93635               while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
93636                   nodes.splice(i, 1);
93637                   if (index === i) index = 0;  // update leading connector instead
93638                   i = nodes.length - 1;
93639               }
93640           }
93641
93642           nodes.splice(index, 1, id);
93643           nodes = nodes.filter(noRepeatNodes);
93644
93645           // If the way was closed before, append a connector node to keep it closed..
93646           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
93647               nodes.push(nodes[0]);
93648           }
93649
93650           return this.update({nodes: nodes});
93651       },
93652
93653
93654       // Replaces each occurrence of node id needle with replacement.
93655       // Consecutive duplicates are eliminated including existing ones.
93656       // Circularity is preserved.
93657       replaceNode: function(needleID, replacementID) {
93658           var nodes = this.nodes.slice();
93659           var isClosed = this.isClosed();
93660
93661           for (var i = 0; i < nodes.length; i++) {
93662               if (nodes[i] === needleID) {
93663                   nodes[i] = replacementID;
93664               }
93665           }
93666
93667           nodes = nodes.filter(noRepeatNodes);
93668
93669           // If the way was closed before, append a connector node to keep it closed..
93670           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
93671               nodes.push(nodes[0]);
93672           }
93673
93674           return this.update({nodes: nodes});
93675       },
93676
93677
93678       // Removes each occurrence of node id.
93679       // Consecutive duplicates are eliminated including existing ones.
93680       // Circularity is preserved.
93681       removeNode: function(id) {
93682           var nodes = this.nodes.slice();
93683           var isClosed = this.isClosed();
93684
93685           nodes = nodes
93686               .filter(function(node) { return node !== id; })
93687               .filter(noRepeatNodes);
93688
93689           // If the way was closed before, append a connector node to keep it closed..
93690           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
93691               nodes.push(nodes[0]);
93692           }
93693
93694           return this.update({nodes: nodes});
93695       },
93696
93697
93698       asJXON: function(changeset_id) {
93699           var r = {
93700               way: {
93701                   '@id': this.osmId(),
93702                   '@version': this.version || 0,
93703                   nd: map$3(this.nodes, function(id) {
93704                       return { keyAttributes: { ref: osmEntity.id.toOSM(id) } };
93705                   }),
93706                   tag: map$3(this.tags, function(v, k) {
93707                       return { keyAttributes: { k: k, v: v } };
93708                   })
93709               }
93710           };
93711           if (changeset_id) {
93712               r.way['@changeset'] = changeset_id;
93713           }
93714           return r;
93715       },
93716
93717
93718       asGeoJSON: function(resolver) {
93719           return resolver.transient(this, 'GeoJSON', function() {
93720               var coordinates = map$3(resolver.childNodes(this), 'loc');
93721               if (this.isArea() && this.isClosed()) {
93722                   return {
93723                       type: 'Polygon',
93724                       coordinates: [coordinates]
93725                   };
93726               } else {
93727                   return {
93728                       type: 'LineString',
93729                       coordinates: coordinates
93730                   };
93731               }
93732           });
93733       },
93734
93735
93736       area: function(resolver) {
93737           return resolver.transient(this, 'area', function() {
93738               var nodes = resolver.childNodes(this);
93739
93740               var json = {
93741                   type: 'Polygon',
93742                   coordinates: [map$3(nodes, 'loc')]
93743               };
93744
93745               if (!this.isClosed() && nodes.length) {
93746                   json.coordinates[0].push(nodes[0].loc);
93747               }
93748
93749               var area = d3_geoArea(json);
93750
93751               // Heuristic for detecting counterclockwise winding order. Assumes
93752               // that OpenStreetMap polygons are not hemisphere-spanning.
93753               if (area > 2 * Math.PI) {
93754                   json.coordinates[0] = json.coordinates[0].reverse();
93755                   area = d3_geoArea(json);
93756               }
93757
93758               return isNaN(area) ? 0 : area;
93759           });
93760       }
93761   });
93762
93763
93764   // Filter function to eliminate consecutive duplicates.
93765   function noRepeatNodes(node, i, arr) {
93766       return i === 0 || node !== arr[i - 1];
93767   }
93768
93769   // "Old" multipolyons, previously known as "simple" multipolygons, are as follows:
93770   //
93771   // 1. Relation tagged with `type=multipolygon` and no interesting tags.
93772   // 2. One and only one member with the `outer` role. Must be a way with interesting tags.
93773   // 3. No members without a role.
93774   //
93775   // Old multipolygons are no longer recommended but are still rendered as areas by iD.
93776
93777   function osmOldMultipolygonOuterMemberOfRelation(entity, graph) {
93778       if (entity.type !== 'relation' ||
93779           !entity.isMultipolygon()
93780           || Object.keys(entity.tags).filter(osmIsInterestingTag).length > 1) {
93781           return false;
93782       }
93783
93784       var outerMember;
93785       for (var memberIndex in entity.members) {
93786           var member = entity.members[memberIndex];
93787           if (!member.role) return false;
93788           if (member.role === 'outer') {
93789               if (outerMember) return false;
93790               if (member.type !== 'way') return false;
93791               if (!graph.hasEntity(member.id)) return false;
93792
93793               outerMember = graph.entity(member.id);
93794
93795               if (Object.keys(outerMember.tags).filter(osmIsInterestingTag).length === 0) {
93796                   return false;
93797               }
93798           }
93799       }
93800
93801       return outerMember;
93802   }
93803
93804   // For fixing up rendering of multipolygons with tags on the outer member.
93805   // https://github.com/openstreetmap/iD/issues/613
93806   function osmIsOldMultipolygonOuterMember(entity, graph) {
93807       if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
93808           return false;
93809
93810       var parents = graph.parentRelations(entity);
93811       if (parents.length !== 1)
93812           return false;
93813
93814       var parent = parents[0];
93815       if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
93816           return false;
93817
93818       var members = parent.members, member;
93819       for (var i = 0; i < members.length; i++) {
93820           member = members[i];
93821           if (member.id === entity.id && member.role && member.role !== 'outer')
93822               return false; // Not outer member
93823           if (member.id !== entity.id && (!member.role || member.role === 'outer'))
93824               return false; // Not a simple multipolygon
93825       }
93826
93827       return parent;
93828   }
93829
93830
93831   function osmOldMultipolygonOuterMember(entity, graph) {
93832       if (entity.type !== 'way')
93833           return false;
93834
93835       var parents = graph.parentRelations(entity);
93836       if (parents.length !== 1)
93837           return false;
93838
93839       var parent = parents[0];
93840       if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
93841           return false;
93842
93843       var members = parent.members, member, outerMember;
93844       for (var i = 0; i < members.length; i++) {
93845           member = members[i];
93846           if (!member.role || member.role === 'outer') {
93847               if (outerMember)
93848                   return false; // Not a simple multipolygon
93849               outerMember = member;
93850           }
93851       }
93852
93853       if (!outerMember)
93854           return false;
93855
93856       var outerEntity = graph.hasEntity(outerMember.id);
93857       if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
93858           return false;
93859
93860       return outerEntity;
93861   }
93862
93863
93864   // Join `toJoin` array into sequences of connecting ways.
93865
93866   // Segments which share identical start/end nodes will, as much as possible,
93867   // be connected with each other.
93868   //
93869   // The return value is a nested array. Each constituent array contains elements
93870   // of `toJoin` which have been determined to connect.
93871   //
93872   // Each consitituent array also has a `nodes` property whose value is an
93873   // ordered array of member nodes, with appropriate order reversal and
93874   // start/end coordinate de-duplication.
93875   //
93876   // Members of `toJoin` must have, at minimum, `type` and `id` properties.
93877   // Thus either an array of `osmWay`s or a relation member array may be used.
93878   //
93879   // If an member is an `osmWay`, its tags and childnodes may be reversed via
93880   // `actionReverse` in the output.
93881   //
93882   // The returned sequences array also has an `actions` array property, containing
93883   // any reversal actions that should be applied to the graph, should the calling
93884   // code attempt to actually join the given ways.
93885   //
93886   // Incomplete members (those for which `graph.hasEntity(element.id)` returns
93887   // false) and non-way members are ignored.
93888   //
93889   function osmJoinWays(toJoin, graph) {
93890       function resolve(member) {
93891           return graph.childNodes(graph.entity(member.id));
93892       }
93893
93894       function reverse(item) {
93895           var action = actionReverse(item.id, { reverseOneway: true });
93896           sequences.actions.push(action);
93897           return (item instanceof osmWay) ? action(graph).entity(item.id) : item;
93898       }
93899
93900       // make a copy containing only the items to join
93901       toJoin = toJoin.filter(function(member) {
93902           return member.type === 'way' && graph.hasEntity(member.id);
93903       });
93904
93905       // Are the things we are joining relation members or `osmWays`?
93906       // If `osmWays`, skip the "prefer a forward path" code below (see #4872)
93907       var i;
93908       var joinAsMembers = true;
93909       for (i = 0; i < toJoin.length; i++) {
93910           if (toJoin[i] instanceof osmWay) {
93911               joinAsMembers = false;
93912               break;
93913           }
93914       }
93915
93916       var sequences = [];
93917       sequences.actions = [];
93918
93919       while (toJoin.length) {
93920           // start a new sequence
93921           var item = toJoin.shift();
93922           var currWays = [item];
93923           var currNodes = resolve(item).slice();
93924           var doneSequence = false;
93925
93926           // add to it
93927           while (toJoin.length && !doneSequence) {
93928               var start = currNodes[0];
93929               var end = currNodes[currNodes.length - 1];
93930               var fn = null;
93931               var nodes = null;
93932
93933               // Find the next way/member to join.
93934               for (i = 0; i < toJoin.length; i++) {
93935                   item = toJoin[i];
93936                   nodes = resolve(item);
93937
93938                   // (for member ordering only, not way ordering - see #4872)
93939                   // Strongly prefer to generate a forward path that preserves the order
93940                   // of the members array. For multipolygons and most relations, member
93941                   // order does not matter - but for routes, it does. (see #4589)
93942                   // If we started this sequence backwards (i.e. next member way attaches to
93943                   // the start node and not the end node), reverse the initial way before continuing.
93944                   if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end &&
93945                       (nodes[nodes.length - 1] === start || nodes[0] === start)
93946                   ) {
93947                       currWays[0] = reverse(currWays[0]);
93948                       currNodes.reverse();
93949                       start = currNodes[0];
93950                       end = currNodes[currNodes.length - 1];
93951                   }
93952
93953                   if (nodes[0] === end) {
93954                       fn = currNodes.push;               // join to end
93955                       nodes = nodes.slice(1);
93956                       break;
93957                   } else if (nodes[nodes.length - 1] === end) {
93958                       fn = currNodes.push;               // join to end
93959                       nodes = nodes.slice(0, -1).reverse();
93960                       item = reverse(item);
93961                       break;
93962                   } else if (nodes[nodes.length - 1] === start) {
93963                       fn = currNodes.unshift;            // join to beginning
93964                       nodes = nodes.slice(0, -1);
93965                       break;
93966                   } else if (nodes[0] === start) {
93967                       fn = currNodes.unshift;            // join to beginning
93968                       nodes = nodes.slice(1).reverse();
93969                       item = reverse(item);
93970                       break;
93971                   } else {
93972                       fn = nodes = null;
93973                   }
93974               }
93975
93976               if (!nodes) {     // couldn't find a joinable way/member
93977                   doneSequence = true;
93978                   break;
93979               }
93980
93981               fn.apply(currWays, [item]);
93982               fn.apply(currNodes, nodes);
93983
93984               toJoin.splice(i, 1);
93985           }
93986
93987           currWays.nodes = currNodes;
93988           sequences.push(currWays);
93989       }
93990
93991       return sequences;
93992   }
93993
93994   function osmRelation() {
93995       if (!(this instanceof osmRelation)) {
93996           return (new osmRelation()).initialize(arguments);
93997       } else if (arguments.length) {
93998           this.initialize(arguments);
93999       }
94000   }
94001
94002
94003   osmEntity.relation = osmRelation;
94004
94005   osmRelation.prototype = Object.create(osmEntity.prototype);
94006
94007
94008   osmRelation.creationOrder = function(a, b) {
94009       var aId = parseInt(osmEntity.id.toOSM(a.id), 10);
94010       var bId = parseInt(osmEntity.id.toOSM(b.id), 10);
94011
94012       if (aId < 0 || bId < 0) return aId - bId;
94013       return bId - aId;
94014   };
94015
94016
94017   assignIn(osmRelation.prototype, {
94018       type: 'relation',
94019       members: [],
94020
94021
94022       copy: function(resolver, copies) {
94023           if (copies[this.id]) return copies[this.id];
94024
94025           var copy = osmEntity.prototype.copy.call(this, resolver, copies);
94026
94027           var members = this.members.map(function(member) {
94028               return assignIn({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
94029           });
94030
94031           copy = copy.update({members: members});
94032           copies[this.id] = copy;
94033
94034           return copy;
94035       },
94036
94037
94038       extent: function(resolver, memo) {
94039           return resolver.transient(this, 'extent', function() {
94040               if (memo && memo[this.id]) return geoExtent();
94041               memo = memo || {};
94042               memo[this.id] = true;
94043
94044               var extent = geoExtent();
94045               for (var i = 0; i < this.members.length; i++) {
94046                   var member = resolver.hasEntity(this.members[i].id);
94047                   if (member) {
94048                       extent._extend(member.extent(resolver, memo));
94049                   }
94050               }
94051               return extent;
94052           });
94053       },
94054
94055
94056       geometry: function(graph) {
94057           return graph.transient(this, 'geometry', function() {
94058               return this.isMultipolygon() ? 'area' : 'relation';
94059           });
94060       },
94061
94062
94063       isDegenerate: function() {
94064           return this.members.length === 0;
94065       },
94066
94067
94068       // Return an array of members, each extended with an 'index' property whose value
94069       // is the member index.
94070       indexedMembers: function() {
94071           var result = new Array(this.members.length);
94072           for (var i = 0; i < this.members.length; i++) {
94073               result[i] = assignIn({}, this.members[i], {index: i});
94074           }
94075           return result;
94076       },
94077
94078
94079       // Return the first member with the given role. A copy of the member object
94080       // is returned, extended with an 'index' property whose value is the member index.
94081       memberByRole: function(role) {
94082           for (var i = 0; i < this.members.length; i++) {
94083               if (this.members[i].role === role) {
94084                   return assignIn({}, this.members[i], {index: i});
94085               }
94086           }
94087       },
94088
94089       // Same as memberByRole, but returns all members with the given role
94090       membersByRole: function(role) {
94091           var result = [];
94092           for (var i = 0; i < this.members.length; i++) {
94093               if (this.members[i].role === role) {
94094                   result.push(assignIn({}, this.members[i], {index: i}));
94095               }
94096           }
94097           return result;
94098       },
94099
94100       // Return the first member with the given id. A copy of the member object
94101       // is returned, extended with an 'index' property whose value is the member index.
94102       memberById: function(id) {
94103           for (var i = 0; i < this.members.length; i++) {
94104               if (this.members[i].id === id) {
94105                   return assignIn({}, this.members[i], {index: i});
94106               }
94107           }
94108       },
94109
94110
94111       // Return the first member with the given id and role. A copy of the member object
94112       // is returned, extended with an 'index' property whose value is the member index.
94113       memberByIdAndRole: function(id, role) {
94114           for (var i = 0; i < this.members.length; i++) {
94115               if (this.members[i].id === id && this.members[i].role === role) {
94116                   return assignIn({}, this.members[i], {index: i});
94117               }
94118           }
94119       },
94120
94121
94122       addMember: function(member, index) {
94123           var members = this.members.slice();
94124           members.splice(index === undefined ? members.length : index, 0, member);
94125           return this.update({members: members});
94126       },
94127
94128
94129       updateMember: function(member, index) {
94130           var members = this.members.slice();
94131           members.splice(index, 1, assignIn({}, members[index], member));
94132           return this.update({members: members});
94133       },
94134
94135
94136       removeMember: function(index) {
94137           var members = this.members.slice();
94138           members.splice(index, 1);
94139           return this.update({members: members});
94140       },
94141
94142
94143       removeMembersWithID: function(id) {
94144           var members = reject(this.members, function(m) { return m.id === id; });
94145           return this.update({members: members});
94146       },
94147
94148
94149       // Wherever a member appears with id `needle.id`, replace it with a member
94150       // with id `replacement.id`, type `replacement.type`, and the original role,
94151       // By default, adding a duplicate member (by id and role) is prevented.
94152       // Return an updated relation.
94153       replaceMember: function(needle, replacement, keepDuplicates) {
94154           if (!this.memberById(needle.id))
94155               return this;
94156
94157           var members = [];
94158
94159           for (var i = 0; i < this.members.length; i++) {
94160               var member = this.members[i];
94161               if (member.id !== needle.id) {
94162                   members.push(member);
94163               } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
94164                   members.push({id: replacement.id, type: replacement.type, role: member.role});
94165               }
94166           }
94167
94168           return this.update({members: members});
94169       },
94170
94171
94172       asJXON: function(changeset_id) {
94173           var r = {
94174               relation: {
94175                   '@id': this.osmId(),
94176                   '@version': this.version || 0,
94177                   member: map$3(this.members, function(member) {
94178                       return {
94179                           keyAttributes: {
94180                               type: member.type,
94181                               role: member.role,
94182                               ref: osmEntity.id.toOSM(member.id)
94183                           }
94184                       };
94185                   }),
94186                   tag: map$3(this.tags, function(v, k) {
94187                       return { keyAttributes: { k: k, v: v } };
94188                   })
94189               }
94190           };
94191           if (changeset_id) r.relation['@changeset'] = changeset_id;
94192           return r;
94193       },
94194
94195
94196       asGeoJSON: function(resolver) {
94197           return resolver.transient(this, 'GeoJSON', function () {
94198               if (this.isMultipolygon()) {
94199                   return {
94200                       type: 'MultiPolygon',
94201                       coordinates: this.multipolygon(resolver)
94202                   };
94203               } else {
94204                   return {
94205                       type: 'FeatureCollection',
94206                       properties: this.tags,
94207                       features: this.members.map(function (member) {
94208                           return assignIn({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
94209                       })
94210                   };
94211               }
94212           });
94213       },
94214
94215
94216       area: function(resolver) {
94217           return resolver.transient(this, 'area', function() {
94218               return d3_geoArea(this.asGeoJSON(resolver));
94219           });
94220       },
94221
94222
94223       isMultipolygon: function() {
94224           return this.tags.type === 'multipolygon';
94225       },
94226
94227
94228       isComplete: function(resolver) {
94229           for (var i = 0; i < this.members.length; i++) {
94230               if (!resolver.hasEntity(this.members[i].id)) {
94231                   return false;
94232               }
94233           }
94234           return true;
94235       },
94236
94237
94238       isRestriction: function() {
94239           return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
94240       },
94241
94242
94243       isValidRestriction: function() {
94244           if (!this.isRestriction()) return false;
94245
94246           var froms = this.members.filter(function(m) { return m.role === 'from'; });
94247           var vias = this.members.filter(function(m) { return m.role === 'via'; });
94248           var tos = this.members.filter(function(m) { return m.role === 'to'; });
94249
94250           if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
94251           if (froms.some(function(m) { return m.type !== 'way'; })) return false;
94252
94253           if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
94254           if (tos.some(function(m) { return m.type !== 'way'; })) return false;
94255
94256           if (vias.length === 0) return false;
94257           if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) return false;
94258
94259           return true;
94260       },
94261
94262
94263       // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
94264       // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
94265       //
94266       // This corresponds to the structure needed for rendering a multipolygon path using a
94267       // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
94268       //
94269       // In the case of invalid geometries, this function will still return a result which
94270       // includes the nodes of all way members, but some Nds may be unclosed and some inner
94271       // rings not matched with the intended outer ring.
94272       //
94273       multipolygon: function(resolver) {
94274           var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); });
94275           var inners = this.members.filter(function(m) { return 'inner' === m.role; });
94276
94277           outers = osmJoinWays(outers, resolver);
94278           inners = osmJoinWays(inners, resolver);
94279
94280           outers = outers.map(function(outer) { return map$3(outer.nodes, 'loc'); });
94281           inners = inners.map(function(inner) { return map$3(inner.nodes, 'loc'); });
94282
94283           var result = outers.map(function(o) {
94284               // Heuristic for detecting counterclockwise winding order. Assumes
94285               // that OpenStreetMap polygons are not hemisphere-spanning.
94286               return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
94287           });
94288
94289           function findOuter(inner) {
94290               var o, outer;
94291
94292               for (o = 0; o < outers.length; o++) {
94293                   outer = outers[o];
94294                   if (geoPolygonContainsPolygon(outer, inner))
94295                       return o;
94296               }
94297
94298               for (o = 0; o < outers.length; o++) {
94299                   outer = outers[o];
94300                   if (geoPolygonIntersectsPolygon(outer, inner, false))
94301                       return o;
94302               }
94303           }
94304
94305           for (var i = 0; i < inners.length; i++) {
94306               var inner = inners[i];
94307
94308               if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
94309                   inner = inner.reverse();
94310               }
94311
94312               var o = findOuter(inners[i]);
94313               if (o !== undefined)
94314                   result[o].push(inners[i]);
94315               else
94316                   result.push([inners[i]]); // Invalid geometry
94317           }
94318
94319           return result;
94320       }
94321   });
94322
94323   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:{}}};
94324
94325   function qaError() {
94326       if (!(this instanceof qaError)) {
94327           return (new qaError()).initialize(arguments);
94328       } else if (arguments.length) {
94329           this.initialize(arguments);
94330       }
94331   }
94332
94333   // Generic handling for services without nice IDs
94334   qaError.id = function() {
94335       return qaError.id.next--;
94336   };
94337
94338   qaError.id.next = -1;
94339
94340   assignIn(qaError.prototype, {
94341       type: 'qaError',
94342
94343       // All errors need a position
94344       loc: [0, 0],
94345
94346       // These should be passed in, used to retrieve from qa_errors.json
94347       service: '',
94348       error_type: '',
94349
94350       initialize: function(sources) {
94351           for (var i = 0; i < sources.length; ++i) {
94352               var source = sources[i];
94353               for (var prop in source) {
94354                   if (Object.prototype.hasOwnProperty.call(source, prop)) {
94355                       if (source[prop] === undefined) {
94356                           delete this[prop];
94357                       } else {
94358                           this[prop] = source[prop];
94359                       }
94360                   }
94361               }
94362           }
94363
94364           // Extract common error information from data
94365           if (this.service && this.error_type) {
94366               var serviceInfo = services$1[this.service];
94367
94368               if (serviceInfo) {
94369                   var errInfo = serviceInfo.errorTypes[this.error_type];
94370
94371                   if (errInfo) {
94372                       this.icon = errInfo.icon;
94373                       this.category = errInfo.category;
94374                   }
94375               }
94376           }
94377
94378           // All errors must have an ID for selection
94379           if (!this.id) {
94380               this.id = qaError.id() + '';  // as string
94381           }
94382
94383           return this;
94384       },
94385
94386       update: function(attrs) {
94387           return qaError(this, attrs); // {v: 1 + (this.v || 0)}
94388       }
94389   });
94390
94391   function osmTurn(turn) {
94392       if (!(this instanceof osmTurn)) {
94393           return new osmTurn(turn);
94394       }
94395       assignIn(this, turn);
94396   }
94397
94398
94399   function osmIntersection(graph, startVertexId, maxDistance) {
94400       maxDistance = maxDistance || 30;    // in meters
94401       var vgraph = coreGraph();           // virtual graph
94402       var i, j, k;
94403
94404
94405       function memberOfRestriction(entity) {
94406           return graph.parentRelations(entity)
94407               .some(function(r) { return r.isRestriction(); });
94408       }
94409
94410       function isRoad(way) {
94411           if (way.isArea() || way.isDegenerate()) return false;
94412           var roads = {
94413               'motorway': true,
94414               'motorway_link': true,
94415               'trunk': true,
94416               'trunk_link': true,
94417               'primary': true,
94418               'primary_link': true,
94419               'secondary': true,
94420               'secondary_link': true,
94421               'tertiary': true,
94422               'tertiary_link': true,
94423               'residential': true,
94424               'unclassified': true,
94425               'living_street': true,
94426               'service': true,
94427               'road': true,
94428               'track': true
94429           };
94430           return roads[way.tags.highway];
94431       }
94432
94433
94434       var startNode = graph.entity(startVertexId);
94435       var checkVertices = [startNode];
94436       var checkWays;
94437       var vertices = [];
94438       var vertexIds = [];
94439       var vertex;
94440       var ways = [];
94441       var wayIds = [];
94442       var way;
94443       var nodes = [];
94444       var node;
94445       var parents = [];
94446       var parent;
94447
94448       // `actions` will store whatever actions must be performed to satisfy
94449       // preconditions for adding a turn restriction to this intersection.
94450       //  - Remove any existing degenerate turn restrictions (missing from/to, etc)
94451       //  - Reverse oneways so that they are drawn in the forward direction
94452       //  - Split ways on key vertices
94453       var actions = [];
94454
94455
94456       // STEP 1:  walk the graph outwards from starting vertex to search
94457       //  for more key vertices and ways to include in the intersection..
94458
94459       while (checkVertices.length) {
94460           vertex = checkVertices.pop();
94461
94462           // check this vertex for parent ways that are roads
94463           checkWays = graph.parentWays(vertex);
94464           var hasWays = false;
94465           for (i = 0; i < checkWays.length; i++) {
94466               way = checkWays[i];
94467               if (!isRoad(way) && !memberOfRestriction(way)) continue;
94468
94469               ways.push(way);   // it's a road, or it's already in a turn restriction
94470               hasWays = true;
94471
94472               // check the way's children for more key vertices
94473               nodes = uniq(graph.childNodes(way));
94474               for (j = 0; j < nodes.length; j++) {
94475                   node = nodes[j];
94476                   if (node === vertex) continue;                                           // same thing
94477                   if (vertices.indexOf(node) !== -1) continue;                             // seen it already
94478                   if (node.loc && startNode.loc &&
94479                       geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue;   // too far from start
94480
94481                   // a key vertex will have parents that are also roads
94482                   var hasParents = false;
94483                   parents = graph.parentWays(node);
94484                   for (k = 0; k < parents.length; k++) {
94485                       parent = parents[k];
94486                       if (parent === way) continue;                 // same thing
94487                       if (ways.indexOf(parent) !== -1) continue;    // seen it already
94488                       if (!isRoad(parent)) continue;                // not a road
94489                       hasParents = true;
94490                       break;
94491                   }
94492
94493                   if (hasParents) {
94494                       checkVertices.push(node);
94495                   }
94496               }
94497           }
94498
94499           if (hasWays) {
94500               vertices.push(vertex);
94501           }
94502       }
94503
94504       vertices = uniq(vertices);
94505       ways = uniq(ways);
94506
94507
94508       // STEP 2:  Build a virtual graph containing only the entities in the intersection..
94509       // Everything done after this step should act on the virtual graph
94510       // Any actions that must be performed later to the main graph go in `actions` array
94511       ways.forEach(function(way) {
94512           graph.childNodes(way).forEach(function(node) {
94513               vgraph = vgraph.replace(node);
94514           });
94515
94516           vgraph = vgraph.replace(way);
94517
94518           graph.parentRelations(way).forEach(function(relation) {
94519               if (relation.isRestriction()) {
94520                   if (relation.isValidRestriction(graph)) {
94521                       vgraph = vgraph.replace(relation);
94522                   } else if (relation.isComplete(graph)) {
94523                       actions.push(actionDeleteRelation(relation.id));
94524                   }
94525               }
94526           });
94527       });
94528
94529
94530       // STEP 3:  Force all oneways to be drawn in the forward direction
94531       ways.forEach(function(w) {
94532           var way = vgraph.entity(w.id);
94533           if (way.tags.oneway === '-1') {
94534               var action = actionReverse(way.id, { reverseOneway: true });
94535               actions.push(action);
94536               vgraph = action(vgraph);
94537           }
94538       });
94539
94540
94541       // STEP 4:  Split ways on key vertices
94542       var origCount = osmEntity.id.next.way;
94543       vertices.forEach(function(v) {
94544           // This is an odd way to do it, but we need to find all the ways that
94545           // will be split here, then split them one at a time to ensure that these
94546           // actions can be replayed on the main graph exactly in the same order.
94547           // (It is unintuitive, but the order of ways returned from graph.parentWays()
94548           // is arbitrary, depending on how the main graph and vgraph were built)
94549           var splitAll = actionSplit(v.id);
94550           if (!splitAll.disabled(vgraph)) {
94551               splitAll.ways(vgraph).forEach(function(way) {
94552                   var splitOne = actionSplit(v.id).limitWays([way.id]);
94553                   actions.push(splitOne);
94554                   vgraph = splitOne(vgraph);
94555               });
94556           }
94557       });
94558
94559       // In here is where we should also split the intersection at nearby junction.
94560       //   for https://github.com/mapbox/iD-internal/issues/31
94561       // nearbyVertices.forEach(function(v) {
94562       // });
94563
94564       // Reasons why we reset the way id count here:
94565       //  1. Continuity with way ids created by the splits so that we can replay
94566       //     these actions later if the user decides to create a turn restriction
94567       //  2. Avoids churning way ids just by hovering over a vertex
94568       //     and displaying the turn restriction editor
94569       osmEntity.id.next.way = origCount;
94570
94571
94572       // STEP 5:  Update arrays to point to vgraph entities
94573       vertexIds = vertices.map(function(v) { return v.id; });
94574       vertices = [];
94575       ways = [];
94576
94577       vertexIds.forEach(function(id) {
94578           var vertex = vgraph.entity(id);
94579           var parents = vgraph.parentWays(vertex);
94580           vertices.push(vertex);
94581           ways = ways.concat(parents);
94582       });
94583
94584       vertices = uniq(vertices);
94585       ways = uniq(ways);
94586
94587       vertexIds = vertices.map(function(v) { return v.id; });
94588       wayIds = ways.map(function(w) { return w.id; });
94589
94590
94591       // STEP 6:  Update the ways with some metadata that will be useful for
94592       // walking the intersection graph later and rendering turn arrows.
94593
94594       function withMetadata(way, vertexIds) {
94595           var __oneWay = way.isOneWay();
94596
94597           // which affixes are key vertices?
94598           var __first = (vertexIds.indexOf(way.first()) !== -1);
94599           var __last = (vertexIds.indexOf(way.last()) !== -1);
94600
94601           // what roles is this way eligible for?
94602           var __via = (__first && __last);
94603           var __from = ((__first && !__oneWay) || __last);
94604           var __to = (__first || (__last && !__oneWay));
94605
94606           return way.update({
94607               __first:  __first,
94608               __last:  __last,
94609               __from:  __from,
94610               __via: __via,
94611               __to:  __to,
94612               __oneWay:  __oneWay
94613           });
94614       }
94615
94616       ways = [];
94617       wayIds.forEach(function(id) {
94618           var way = withMetadata(vgraph.entity(id), vertexIds);
94619           vgraph = vgraph.replace(way);
94620           ways.push(way);
94621       });
94622
94623
94624       // STEP 7:  Simplify - This is an iterative process where we:
94625       //  1. Find trivial vertices with only 2 parents
94626       //  2. trim off the leaf way from those vertices and remove from vgraph
94627
94628       var keepGoing;
94629       var removeWayIds = [];
94630       var removeVertexIds = [];
94631
94632       do {
94633           keepGoing = false;
94634           checkVertices = vertexIds.slice();
94635
94636           for (i = 0; i < checkVertices.length; i++) {
94637               var vertexId = checkVertices[i];
94638               vertex = vgraph.hasEntity(vertexId);
94639
94640               if (!vertex) {
94641                   if (vertexIds.indexOf(vertexId) !== -1) {
94642                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
94643                   }
94644                   removeVertexIds.push(vertexId);
94645                   continue;
94646               }
94647
94648               parents = vgraph.parentWays(vertex);
94649               if (parents.length < 3) {
94650                   if (vertexIds.indexOf(vertexId) !== -1) {
94651                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
94652                   }
94653               }
94654
94655               if (parents.length === 2) {     // vertex with 2 parents is trivial
94656                   var a = parents[0];
94657                   var b = parents[1];
94658                   var aIsLeaf = a && !a.__via;
94659                   var bIsLeaf = b && !b.__via;
94660                   var leaf, survivor;
94661
94662                   if (aIsLeaf && !bIsLeaf) {
94663                       leaf = a;
94664                       survivor = b;
94665                   } else if (!aIsLeaf && bIsLeaf) {
94666                       leaf = b;
94667                       survivor = a;
94668                   }
94669
94670                   if (leaf && survivor) {
94671                       survivor = withMetadata(survivor, vertexIds);      // update survivor way
94672                       vgraph = vgraph.replace(survivor).remove(leaf);    // update graph
94673                       removeWayIds.push(leaf.id);
94674                       keepGoing = true;
94675                   }
94676               }
94677
94678               parents = vgraph.parentWays(vertex);
94679
94680               if (parents.length < 2) {     // vertex is no longer a key vertex
94681                   if (vertexIds.indexOf(vertexId) !== -1) {
94682                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
94683                   }
94684                   removeVertexIds.push(vertexId);
94685                   keepGoing = true;
94686               }
94687
94688               if (parents.length < 1) {     // vertex is no longer attached to anything
94689                   vgraph = vgraph.remove(vertex);
94690               }
94691
94692           }
94693       } while (keepGoing);
94694
94695
94696       vertices = vertices
94697           .filter(function(vertex) { return removeVertexIds.indexOf(vertex.id) === -1; })
94698           .map(function(vertex) { return vgraph.entity(vertex.id); });
94699       ways = ways
94700           .filter(function(way) { return removeWayIds.indexOf(way.id) === -1; })
94701           .map(function(way) { return vgraph.entity(way.id); });
94702
94703
94704       // OK!  Here is our intersection..
94705       var intersection = {
94706           graph: vgraph,
94707           actions: actions,
94708           vertices: vertices,
94709           ways: ways,
94710       };
94711
94712
94713
94714       // Get all the valid turns through this intersection given a starting way id.
94715       // This operates on the virtual graph for everything.
94716       //
94717       // Basically, walk through all possible paths from starting way,
94718       //   honoring the existing turn restrictions as we go (watch out for loops!)
94719       //
94720       // For each path found, generate and return a `osmTurn` datastructure.
94721       //
94722       intersection.turns = function(fromWayId, maxViaWay) {
94723           if (!fromWayId) return [];
94724           if (!maxViaWay) maxViaWay = 0;
94725
94726           var vgraph = intersection.graph;
94727           var keyVertexIds = intersection.vertices.map(function(v) { return v.id; });
94728
94729           var start = vgraph.entity(fromWayId);
94730           if (!start || !(start.__from || start.__via)) return [];
94731
94732           // maxViaWay=0   from-*-to              (0 vias)
94733           // maxViaWay=1   from-*-via-*-to        (1 via max)
94734           // maxViaWay=2   from-*-via-*-via-*-to  (2 vias max)
94735           var maxPathLength = (maxViaWay * 2) + 3;
94736           var turns = [];
94737
94738           step(start);
94739           return turns;
94740
94741
94742           // traverse the intersection graph and find all the valid paths
94743           function step(entity, currPath, currRestrictions, matchedRestriction) {
94744               currPath = clone(currPath || []);
94745               if (currPath.length >= maxPathLength) return;
94746               currPath.push(entity.id);
94747               currRestrictions = clone(currRestrictions || []);
94748               var i, j;
94749
94750               if (entity.type === 'node') {
94751                   var parents = vgraph.parentWays(entity);
94752                   var nextWays = [];
94753
94754                   // which ways can we step into?
94755                   for (i = 0; i < parents.length; i++) {
94756                       var way = parents[i];
94757
94758                       // if next way is a oneway incoming to this vertex, skip
94759                       if (way.__oneWay && way.nodes[0] !== entity.id) continue;
94760
94761                       // if we have seen it before (allowing for an initial u-turn), skip
94762                       if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue;
94763
94764                       // Check all "current" restrictions (where we've already walked the `FROM`)
94765                       var restrict = undefined;
94766                       for (j = 0; j < currRestrictions.length; j++) {
94767                           var restriction = currRestrictions[j];
94768                           var f = restriction.memberByRole('from');
94769                           var v = restriction.membersByRole('via');
94770                           var t = restriction.memberByRole('to');
94771                           var isOnly = /^only_/.test(restriction.tags.restriction);
94772
94773                           // Does the current path match this turn restriction?
94774                           var matchesFrom = (f.id === fromWayId);
94775                           var matchesViaTo = false;
94776                           var isAlongOnlyPath = false;
94777
94778                           if (t.id === way.id) {     // match TO
94779
94780                               if (v.length === 1 && v[0].type === 'node') {    // match VIA node
94781                                   matchesViaTo = (v[0].id === entity.id && (
94782                                       (matchesFrom && currPath.length === 2) ||
94783                                       (!matchesFrom && currPath.length > 2)
94784                                   ));
94785
94786                               } else {                                         // match all VIA ways
94787                                   var pathVias = [];
94788                                   for (k = 2; k < currPath.length; k +=2 ) {   // k = 2 skips FROM
94789                                       pathVias.push(currPath[k]);              // (path goes way-node-way...)
94790                                   }
94791                                   var restrictionVias = [];
94792                                   for (k = 0; k < v.length; k++) {
94793                                       if (v[k].type === 'way') {
94794                                           restrictionVias.push(v[k].id);
94795                                       }
94796                                   }
94797                                   var diff = difference(pathVias, restrictionVias);
94798                                   matchesViaTo = !diff.length;
94799                               }
94800
94801                           } else if (isOnly) {
94802                               for (k = 0; k < v.length; k++) {
94803                                   // way doesn't match TO, but is one of the via ways along the path of an "only"
94804                                   if (v[k].type === 'way' && v[k].id === way.id) {
94805                                       isAlongOnlyPath = true;
94806                                       break;
94807                                   }
94808                               }
94809                           }
94810
94811                           if (matchesViaTo) {
94812                               if (isOnly) {
94813                                   restrict = { id: restriction.id, direct: matchesFrom, from: f.id, only: true, end: true };
94814                               } else {
94815                                   restrict = { id: restriction.id, direct: matchesFrom, from: f.id, no: true, end: true };
94816                               }
94817                           } else {    // indirect - caused by a different nearby restriction
94818                               if (isAlongOnlyPath) {
94819                                   restrict = { id: restriction.id, direct: false, from: f.id, only: true, end: false };
94820                               } else if (isOnly) {
94821                                   restrict = { id: restriction.id, direct: false, from: f.id, no: true, end: true };
94822                               }
94823                           }
94824
94825                           // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
94826                           if (restrict && restrict.direct)
94827                               break;
94828                       }
94829
94830                       nextWays.push({ way: way, restrict: restrict });
94831                   }
94832
94833                   nextWays.forEach(function(nextWay) {
94834                       step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
94835                   });
94836
94837
94838               } else {  // entity.type === 'way'
94839                   if (currPath.length >= 3) {     // this is a "complete" path..
94840                       var turnPath = clone(currPath);
94841
94842                       // an indirect restriction - only include the partial path (starting at FROM)
94843                       if (matchedRestriction && matchedRestriction.direct === false) {
94844                           for (i = 0; i < turnPath.length; i++) {
94845                               if (turnPath[i] === matchedRestriction.from) {
94846                                   turnPath = turnPath.slice(i);
94847                                   break;
94848                               }
94849                           }
94850                       }
94851
94852                       var turn = pathToTurn(turnPath);
94853                       if (turn) {
94854                           if (matchedRestriction) {
94855                               turn.restrictionID = matchedRestriction.id;
94856                               turn.no = matchedRestriction.no;
94857                               turn.only = matchedRestriction.only;
94858                               turn.direct = matchedRestriction.direct;
94859                           }
94860                           turns.push(osmTurn(turn));
94861                       }
94862
94863                       if (currPath[0] === currPath[2]) return;   // if we made a u-turn - stop here
94864                   }
94865
94866                   if (matchedRestriction && matchedRestriction.end) return;  // don't advance any further
94867
94868                   // which nodes can we step into?
94869                   var n1 = vgraph.entity(entity.first());
94870                   var n2 = vgraph.entity(entity.last());
94871                   var dist = n1.loc && n2.loc && geoSphericalDistance(n1.loc, n2.loc);
94872                   var nextNodes = [];
94873
94874                   if (currPath.length > 1) {
94875                       if (dist > maxDistance) return;   // the next node is too far
94876                       if (!entity.__via) return;        // this way is a leaf / can't be a via
94877                   }
94878
94879                   if (!entity.__oneWay &&                     // bidirectional..
94880                       keyVertexIds.indexOf(n1.id) !== -1 &&   // key vertex..
94881                       currPath.indexOf(n1.id) === -1) {       // haven't seen it yet..
94882                       nextNodes.push(n1);                     // can advance to first node
94883                   }
94884                   if (keyVertexIds.indexOf(n2.id) !== -1 &&   // key vertex..
94885                       currPath.indexOf(n2.id) === -1) {       // haven't seen it yet..
94886                       nextNodes.push(n2);                     // can advance to last node
94887                   }
94888
94889                   nextNodes.forEach(function(nextNode) {
94890                       // gather restrictions FROM this way
94891                       var fromRestrictions = vgraph.parentRelations(entity).filter(function(r) {
94892                           if (!r.isRestriction()) return false;
94893
94894                           var f = r.memberByRole('from');
94895                           if (!f || f.id !== entity.id) return false;
94896
94897                           var isOnly = /^only_/.test(r.tags.restriction);
94898                           if (!isOnly) return true;
94899
94900                           // `only_` restrictions only matter along the direction of the VIA - #4849
94901                           var isOnlyVia = false;
94902                           var v = r.membersByRole('via');
94903                           if (v.length === 1 && v[0].type === 'node') {   // via node
94904                               isOnlyVia = (v[0].id === nextNode.id);
94905                           } else {                                        // via way(s)
94906                               for (var i = 0; i < v.length; i++) {
94907                                   if (v[i].type !== 'way') continue;
94908                                   var viaWay = vgraph.entity(v[i].id);
94909                                   if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
94910                                       isOnlyVia = true;
94911                                       break;
94912                                   }
94913                               }
94914                           }
94915                           return isOnlyVia;
94916                       });
94917
94918                       step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
94919                   });
94920               }
94921           }
94922
94923
94924           // assumes path is alternating way-node-way of odd length
94925           function pathToTurn(path) {
94926               if (path.length < 3) return;
94927               var fromWayId, fromNodeId, fromVertexId;
94928               var toWayId, toNodeId, toVertexId;
94929               var viaWayIds, viaNodeId, isUturn;
94930
94931               fromWayId = path[0];
94932               toWayId = path[path.length - 1];
94933
94934               if (path.length === 3 && fromWayId === toWayId) {  // u turn
94935                   var way = vgraph.entity(fromWayId);
94936                   if (way.__oneWay) return null;
94937
94938                   isUturn = true;
94939                   viaNodeId = fromVertexId = toVertexId = path[1];
94940                   fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
94941
94942               } else {
94943                   isUturn = false;
94944                   fromVertexId = path[1];
94945                   fromNodeId = adjacentNode(fromWayId, fromVertexId);
94946                   toVertexId = path[path.length - 2];
94947                   toNodeId = adjacentNode(toWayId, toVertexId);
94948
94949                   if (path.length === 3) {
94950                       viaNodeId = path[1];
94951                   } else {
94952                       viaWayIds = path.filter(function(entityId) { return entityId[0] === 'w'; });
94953                       viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1);  // remove first, last
94954                   }
94955               }
94956
94957               return {
94958                   key:  path.join('_'),
94959                   path: path,
94960                   from: { node: fromNodeId, way:  fromWayId, vertex: fromVertexId },
94961                   via:  { node: viaNodeId,  ways: viaWayIds },
94962                   to:   { node: toNodeId,   way:  toWayId, vertex: toVertexId },
94963                   u:    isUturn
94964               };
94965
94966
94967               function adjacentNode(wayId, affixId) {
94968                   var nodes = vgraph.entity(wayId).nodes;
94969                   return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
94970               }
94971           }
94972
94973       };
94974
94975       return intersection;
94976   }
94977
94978
94979   function osmInferRestriction(graph, turn, projection) {
94980       var fromWay = graph.entity(turn.from.way);
94981       var fromNode = graph.entity(turn.from.node);
94982       var fromVertex = graph.entity(turn.from.vertex);
94983       var toWay = graph.entity(turn.to.way);
94984       var toNode = graph.entity(turn.to.node);
94985       var toVertex = graph.entity(turn.to.vertex);
94986
94987       var fromOneWay = (fromWay.tags.oneway === 'yes');
94988       var toOneWay = (toWay.tags.oneway === 'yes');
94989       var angle = (geoAngle(fromVertex, fromNode, projection) -
94990                   geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
94991
94992       while (angle < 0)
94993           angle += 360;
94994
94995       if (fromNode === toNode)
94996           return 'no_u_turn';
94997       if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
94998           return 'no_u_turn';   // wider tolerance for u-turn if both ways are oneway
94999       if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex)
95000           return 'no_u_turn';   // even wider tolerance for u-turn if there is a via way (from !== to)
95001       if (angle < 158)
95002           return 'no_right_turn';
95003       if (angle > 202)
95004           return 'no_left_turn';
95005
95006       return 'no_straight_on';
95007   }
95008
95009   function actionAddMember(relationId, member, memberIndex, insertPair) {
95010
95011       return function action(graph) {
95012           var relation = graph.entity(relationId);
95013
95014           // There are some special rules for Public Transport v2 routes.
95015           var isPTv2 = /stop|platform/.test(member.role);
95016
95017           if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) {
95018               // Try to perform sensible inserts based on how the ways join together
95019               graph = addWayMember(relation, graph);
95020           } else {
95021               // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
95022               // Stops and Platforms for PTv2 should be ordered first.
95023               // hack: We do not currently have the ability to place them in the exactly correct order.
95024               if (isPTv2 && isNaN(memberIndex)) {
95025                   memberIndex = 0;
95026               }
95027
95028               graph = graph.replace(relation.addMember(member, memberIndex));
95029           }
95030
95031           return graph;
95032       };
95033
95034
95035       // Add a way member into the relation "wherever it makes sense".
95036       // In this situation we were not supplied a memberIndex.
95037       function addWayMember(relation, graph) {
95038           var groups, tempWay, item, i, j, k;
95039
95040           // remove PTv2 stops and platforms before doing anything.
95041           var PTv2members = [];
95042           var members = [];
95043           for (i = 0; i < relation.members.length; i++) {
95044               var m = relation.members[i];
95045               if (/stop|platform/.test(m.role)) {
95046                   PTv2members.push(m);
95047               } else {
95048                   members.push(m);
95049               }
95050           }
95051           relation = relation.update({ members: members });
95052
95053
95054           if (insertPair) {
95055               // We're adding a member that must stay paired with an existing member.
95056               // (This feature is used by `actionSplit`)
95057               //
95058               // This is tricky because the members may exist multiple times in the
95059               // member list, and with different A-B/B-A ordering and different roles.
95060               // (e.g. a bus route that loops out and back - #4589).
95061               //
95062               // Replace the existing member with a temporary way,
95063               // so that `osmJoinWays` can treat the pair like a single way.
95064               tempWay = osmWay({ id: 'wTemp', nodes: insertPair.nodes });
95065               graph = graph.replace(tempWay);
95066               var tempMember = { id: tempWay.id, type: 'way', role: member.role };
95067               var tempRelation = relation.replaceMember({id: insertPair.originalID}, tempMember, true);
95068               groups = groupBy(tempRelation.members, function(m) { return m.type; });
95069               groups.way = groups.way || [];
95070
95071           } else {
95072               // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
95073               groups = groupBy(relation.members, function(m) { return m.type; });
95074               groups.way = groups.way || [];
95075               groups.way.push(member);
95076           }
95077
95078           members = withIndex(groups.way);
95079           var joined = osmJoinWays(members, graph);
95080
95081           // `joined` might not contain all of the way members,
95082           // But will contain only the completed (downloaded) members
95083           for (i = 0; i < joined.length; i++) {
95084               var segment = joined[i];
95085               var nodes = segment.nodes.slice();
95086               var startIndex = segment[0].index;
95087
95088               // j = array index in `members` where this segment starts
95089               for (j = 0; j < members.length; j++) {
95090                   if (members[j].index === startIndex) {
95091                       break;
95092                   }
95093               }
95094
95095               // k = each member in segment
95096               for (k = 0; k < segment.length; k++) {
95097                   item = segment[k];
95098                   var way = graph.entity(item.id);
95099
95100                   // If this is a paired item, generate members in correct order and role
95101                   if (tempWay && item.id === tempWay.id) {
95102                       if (nodes[0].id === insertPair.nodes[0]) {
95103                           item.pair = [
95104                               { id: insertPair.originalID, type: 'way', role: item.role },
95105                               { id: insertPair.insertedID, type: 'way', role: item.role }
95106                           ];
95107                       } else {
95108                           item.pair = [
95109                               { id: insertPair.insertedID, type: 'way', role: item.role },
95110                               { id: insertPair.originalID, type: 'way', role: item.role }
95111                           ];
95112                       }
95113                   }
95114
95115                   // reorder `members` if necessary
95116                   if (k > 0) {
95117                       if (j+k >= members.length || item.index !== members[j+k].index) {
95118                           moveMember(members, item.index, j+k);
95119                       }
95120                   }
95121
95122                   nodes.splice(0, way.nodes.length - 1);
95123               }
95124           }
95125
95126           if (tempWay) {
95127               graph = graph.remove(tempWay);
95128           }
95129
95130           // Final pass: skip dead items, split pairs, remove index properties
95131           var wayMembers = [];
95132           for (i = 0; i < members.length; i++) {
95133               item = members[i];
95134               if (item.index === -1) continue;
95135
95136               if (item.pair) {
95137                   wayMembers.push(item.pair[0]);
95138                   wayMembers.push(item.pair[1]);
95139               } else {
95140                   wayMembers.push(omit(item, 'index'));
95141               }
95142           }
95143
95144           // Put stops and platforms first, then nodes, ways, relations
95145           // This is recommended for Public Transport v2 routes:
95146           // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
95147           var newMembers = PTv2members.concat( (groups.node || []), wayMembers, (groups.relation || []) );
95148
95149           return graph.replace(relation.update({members: newMembers}));
95150
95151
95152           // `moveMember()` changes the `members` array in place by splicing
95153           // the item with `.index = findIndex` to where it belongs,
95154           // and marking the old position as "dead" with `.index = -1`
95155           //
95156           // j=5, k=0                jk
95157           // segment                 5 4 7 6
95158           // members       0 1 2 3 4 5 6 7 8 9        keep 5 in j+k
95159           //
95160           // j=5, k=1                j k
95161           // segment                 5 4 7 6
95162           // members       0 1 2 3 4 5 6 7 8 9        move 4 to j+k
95163           // members       0 1 2 3 x 5 4 6 7 8 9      moved
95164           //
95165           // j=5, k=2                j   k
95166           // segment                 5 4 7 6
95167           // members       0 1 2 3 x 5 4 6 7 8 9      move 7 to j+k
95168           // members       0 1 2 3 x 5 4 7 6 x 8 9    moved
95169           //
95170           // j=5, k=3                j     k
95171           // segment                 5 4 7 6
95172           // members       0 1 2 3 x 5 4 7 6 x 8 9    keep 6 in j+k
95173           //
95174           function moveMember(arr, findIndex, toIndex) {
95175               for (var i = 0; i < arr.length; i++) {
95176                   if (arr[i].index === findIndex) {
95177                       break;
95178                   }
95179               }
95180
95181               var item = clone(arr[i]);
95182               arr[i].index = -1;   // mark as dead
95183               item.index = toIndex;
95184               arr.splice(toIndex, 0, item);
95185           }
95186
95187
95188           // This is the same as `Relation.indexedMembers`,
95189           // Except we don't want to index all the members, only the ways
95190           function withIndex(arr) {
95191               var result = new Array(arr.length);
95192               for (var i = 0; i < arr.length; i++) {
95193                   result[i] = clone(arr[i]);
95194                   result[i].index = i;
95195               }
95196               return result;
95197           }
95198       }
95199
95200   }
95201
95202   function actionAddMidpoint(midpoint, node) {
95203       return function(graph) {
95204           graph = graph.replace(node.move(midpoint.loc));
95205
95206           var parents = intersection(
95207               graph.parentWays(graph.entity(midpoint.edge[0])),
95208               graph.parentWays(graph.entity(midpoint.edge[1])));
95209
95210           parents.forEach(function(way) {
95211               for (var i = 0; i < way.nodes.length - 1; i++) {
95212                   if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
95213                       graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
95214
95215                       // Add only one midpoint on doubled-back segments,
95216                       // turning them into self-intersections.
95217                       return;
95218                   }
95219               }
95220           });
95221
95222           return graph;
95223       };
95224   }
95225
95226   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
95227   function actionAddVertex(wayId, nodeId, index) {
95228       return function(graph) {
95229           return graph.replace(graph.entity(wayId).addNode(nodeId, index));
95230       };
95231   }
95232
95233   function actionChangeMember(relationId, member, memberIndex) {
95234       return function(graph) {
95235           return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
95236       };
95237   }
95238
95239   function actionChangePreset(entityID, oldPreset, newPreset) {
95240       return function action(graph) {
95241           var entity = graph.entity(entityID);
95242           var geometry = entity.geometry(graph);
95243           var tags = entity.tags;
95244
95245           if (oldPreset) tags = oldPreset.unsetTags(tags, geometry);
95246           if (newPreset) tags = newPreset.setTags(tags, geometry);
95247
95248           return graph.replace(entity.update({tags: tags}));
95249       };
95250   }
95251
95252   function actionChangeTags(entityId, tags) {
95253       return function(graph) {
95254           var entity = graph.entity(entityId);
95255           return graph.replace(entity.update({tags: tags}));
95256       };
95257   }
95258
95259   function actionCircularize(wayId, projection, maxAngle) {
95260       maxAngle = (maxAngle || 20) * Math.PI / 180;
95261
95262
95263       var action = function(graph, t) {
95264           if (t === null || !isFinite(t)) t = 1;
95265           t = Math.min(Math.max(+t, 0), 1);
95266
95267           var way = graph.entity(wayId),
95268               origNodes = {};
95269
95270           graph.childNodes(way).forEach(function(node) {
95271               if (!origNodes[node.id]) origNodes[node.id] = node;
95272           });
95273
95274           if (!way.isConvex(graph)) {
95275               graph = action.makeConvex(graph);
95276           }
95277
95278           var nodes = uniq(graph.childNodes(way)),
95279               keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; }),
95280               points = nodes.map(function(n) { return projection(n.loc); }),
95281               keyPoints = keyNodes.map(function(n) { return projection(n.loc); }),
95282               centroid = (points.length === 2) ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points),
95283               radius = d3_median(points, function(p) { return geoVecLength(centroid, p); }),
95284               sign = d3_polygonArea(points) > 0 ? 1 : -1,
95285               ids;
95286
95287           // we need atleast two key nodes for the algorithm to work
95288           if (!keyNodes.length) {
95289               keyNodes = [nodes[0]];
95290               keyPoints = [points[0]];
95291           }
95292
95293           if (keyNodes.length === 1) {
95294               var index = nodes.indexOf(keyNodes[0]),
95295                   oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
95296
95297               keyNodes.push(nodes[oppositeIndex]);
95298               keyPoints.push(points[oppositeIndex]);
95299           }
95300
95301           // key points and nodes are those connected to the ways,
95302           // they are projected onto the circle, inbetween nodes are moved
95303           // to constant intervals between key nodes, extra inbetween nodes are
95304           // added if necessary.
95305           for (var i = 0; i < keyPoints.length; i++) {
95306               var nextKeyNodeIndex = (i + 1) % keyNodes.length,
95307                   startNode = keyNodes[i],
95308                   endNode = keyNodes[nextKeyNodeIndex],
95309                   startNodeIndex = nodes.indexOf(startNode),
95310                   endNodeIndex = nodes.indexOf(endNode),
95311                   numberNewPoints = -1,
95312                   indexRange = endNodeIndex - startNodeIndex,
95313                   nearNodes = {},
95314                   inBetweenNodes = [],
95315                   startAngle, endAngle, totalAngle, eachAngle,
95316                   angle, loc, node, origNode, j;
95317
95318               if (indexRange < 0) {
95319                   indexRange += nodes.length;
95320               }
95321
95322               // position this key node
95323               var distance = geoVecLength(centroid, keyPoints[i]);
95324               if (distance === 0) { distance = 1e-4; }
95325               keyPoints[i] = [
95326                   centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
95327                   centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
95328               ];
95329               loc = projection.invert(keyPoints[i]);
95330               node = keyNodes[i];
95331               origNode = origNodes[node.id];
95332               node = node.move(geoVecInterp(origNode.loc, loc, t));
95333               graph = graph.replace(node);
95334
95335               // figure out the between delta angle we want to match to
95336               startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
95337               endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
95338               totalAngle = endAngle - startAngle;
95339
95340               // detects looping around -pi/pi
95341               if (totalAngle * sign > 0) {
95342                   totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
95343               }
95344
95345               do {
95346                   numberNewPoints++;
95347                   eachAngle = totalAngle / (indexRange + numberNewPoints);
95348               } while (Math.abs(eachAngle) > maxAngle);
95349
95350
95351               // move existing nodes
95352               for (j = 1; j < indexRange; j++) {
95353                   angle = startAngle + j * eachAngle;
95354                   loc = projection.invert([
95355                       centroid[0] + Math.cos(angle) * radius,
95356                       centroid[1] + Math.sin(angle) * radius
95357                   ]);
95358
95359                   node = nodes[(j + startNodeIndex) % nodes.length];
95360                   origNode = origNodes[node.id];
95361                   nearNodes[node.id] = angle;
95362
95363                   node = node.move(geoVecInterp(origNode.loc, loc, t));
95364                   graph = graph.replace(node);
95365               }
95366
95367               // add new inbetween nodes if necessary
95368               for (j = 0; j < numberNewPoints; j++) {
95369                   angle = startAngle + (indexRange + j) * eachAngle;
95370                   loc = projection.invert([
95371                       centroid[0] + Math.cos(angle) * radius,
95372                       centroid[1] + Math.sin(angle) * radius
95373                   ]);
95374
95375                   // choose a nearnode to use as the original
95376                   var min = Infinity;
95377                   for (var nodeId in nearNodes) {
95378                       var nearAngle = nearNodes[nodeId],
95379                           dist = Math.abs(nearAngle - angle);
95380                       if (dist < min) {
95381                           dist = min;
95382                           origNode = origNodes[nodeId];
95383                       }
95384                   }
95385
95386                   node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
95387                   graph = graph.replace(node);
95388
95389                   nodes.splice(endNodeIndex + j, 0, node);
95390                   inBetweenNodes.push(node.id);
95391               }
95392
95393               // Check for other ways that share these keyNodes..
95394               // If keyNodes are adjacent in both ways,
95395               // we can add inBetween nodes to that shared way too..
95396               if (indexRange === 1 && inBetweenNodes.length) {
95397                   var startIndex1 = way.nodes.lastIndexOf(startNode.id),
95398                       endIndex1 = way.nodes.lastIndexOf(endNode.id),
95399                       wayDirection1 = (endIndex1 - startIndex1);
95400                   if (wayDirection1 < -1) { wayDirection1 = 1; }
95401
95402                   /* eslint-disable no-loop-func */
95403                   forEach(without(graph.parentWays(keyNodes[i]), way), function(sharedWay) {
95404                       if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
95405                           var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id),
95406                               endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id),
95407                               wayDirection2 = (endIndex2 - startIndex2),
95408                               insertAt = endIndex2;
95409                           if (wayDirection2 < -1) { wayDirection2 = 1; }
95410
95411                           if (wayDirection1 !== wayDirection2) {
95412                               inBetweenNodes.reverse();
95413                               insertAt = startIndex2;
95414                           }
95415                           for (j = 0; j < inBetweenNodes.length; j++) {
95416                               sharedWay = sharedWay.addNode(inBetweenNodes[j], insertAt + j);
95417                           }
95418                           graph = graph.replace(sharedWay);
95419                       }
95420                   });
95421                   /* eslint-enable no-loop-func */
95422               }
95423
95424           }
95425
95426           // update the way to have all the new nodes
95427           ids = nodes.map(function(n) { return n.id; });
95428           ids.push(ids[0]);
95429
95430           way = way.update({nodes: ids});
95431           graph = graph.replace(way);
95432
95433           return graph;
95434       };
95435
95436
95437       action.makeConvex = function(graph) {
95438           var way = graph.entity(wayId),
95439               nodes = uniq(graph.childNodes(way)),
95440               points = nodes.map(function(n) { return projection(n.loc); }),
95441               sign = d3_polygonArea(points) > 0 ? 1 : -1,
95442               hull = d3_polygonHull(points);
95443
95444           // D3 convex hulls go counterclockwise..
95445           if (sign === -1) {
95446               nodes.reverse();
95447               points.reverse();
95448           }
95449
95450           for (var i = 0; i < hull.length - 1; i++) {
95451               var startIndex = points.indexOf(hull[i]),
95452                   endIndex = points.indexOf(hull[i+1]),
95453                   indexRange = (endIndex - startIndex);
95454
95455               if (indexRange < 0) {
95456                   indexRange += nodes.length;
95457               }
95458
95459               // move interior nodes to the surface of the convex hull..
95460               for (var j = 1; j < indexRange; j++) {
95461                   var point = geoVecInterp(hull[i], hull[i+1], j / indexRange),
95462                       node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
95463                   graph = graph.replace(node);
95464               }
95465           }
95466           return graph;
95467       };
95468
95469
95470       action.disabled = function(graph) {
95471           if (!graph.entity(wayId).isClosed())
95472               return 'not_closed';
95473       };
95474
95475
95476       action.transitionable = true;
95477
95478
95479       return action;
95480   }
95481
95482   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
95483   function actionDeleteWay(wayId) {
95484
95485
95486       function canDeleteNode(node, graph) {
95487           return !graph.parentWays(node).length &&
95488               !graph.parentRelations(node).length &&
95489               !node.hasInterestingTags();
95490       }
95491
95492
95493       var action = function(graph) {
95494           var way = graph.entity(wayId);
95495
95496           graph.parentRelations(way)
95497               .forEach(function(parent) {
95498                   parent = parent.removeMembersWithID(wayId);
95499                   graph = graph.replace(parent);
95500
95501                   if (parent.isDegenerate()) {
95502                       graph = actionDeleteRelation(parent.id)(graph);
95503                   }
95504               });
95505
95506           uniq(way.nodes).forEach(function(nodeId) {
95507               graph = graph.replace(way.removeNode(nodeId));
95508
95509               var node = graph.entity(nodeId);
95510               if (canDeleteNode(node, graph)) {
95511                   graph = graph.remove(node);
95512               }
95513           });
95514
95515           return graph.remove(way);
95516       };
95517
95518
95519       return action;
95520   }
95521
95522   function actionDeleteMultiple(ids) {
95523       var actions = {
95524           way: actionDeleteWay,
95525           node: actionDeleteNode,
95526           relation: actionDeleteRelation
95527       };
95528
95529
95530       var action = function(graph) {
95531           ids.forEach(function(id) {
95532               if (graph.hasEntity(id)) { // It may have been deleted aready.
95533                   graph = actions[graph.entity(id).type](id)(graph);
95534               }
95535           });
95536
95537           return graph;
95538       };
95539
95540
95541       return action;
95542   }
95543
95544   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
95545   function actionDeleteRelation(relationId) {
95546
95547
95548       function canDeleteEntity(entity, graph) {
95549           return !graph.parentWays(entity).length &&
95550               !graph.parentRelations(entity).length &&
95551               !entity.hasInterestingTags();
95552       }
95553
95554
95555       var action = function(graph) {
95556           var relation = graph.entity(relationId);
95557
95558           graph.parentRelations(relation)
95559               .forEach(function(parent) {
95560                   parent = parent.removeMembersWithID(relationId);
95561                   graph = graph.replace(parent);
95562
95563                   if (parent.isDegenerate()) {
95564                       graph = actionDeleteRelation(parent.id)(graph);
95565                   }
95566               });
95567
95568           uniq(map$3(relation.members, 'id')).forEach(function(memberId) {
95569               graph = graph.replace(relation.removeMembersWithID(memberId));
95570
95571               var entity = graph.entity(memberId);
95572               if (canDeleteEntity(entity, graph)) {
95573                   graph = actionDeleteMultiple([memberId])(graph);
95574               }
95575           });
95576
95577           return graph.remove(relation);
95578       };
95579
95580
95581       return action;
95582   }
95583
95584   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
95585   function actionDeleteNode(nodeId) {
95586       var action = function(graph) {
95587           var node = graph.entity(nodeId);
95588
95589           graph.parentWays(node)
95590               .forEach(function(parent) {
95591                   parent = parent.removeNode(nodeId);
95592                   graph = graph.replace(parent);
95593
95594                   if (parent.isDegenerate()) {
95595                       graph = actionDeleteWay(parent.id)(graph);
95596                   }
95597               });
95598
95599           graph.parentRelations(node)
95600               .forEach(function(parent) {
95601                   parent = parent.removeMembersWithID(nodeId);
95602                   graph = graph.replace(parent);
95603
95604                   if (parent.isDegenerate()) {
95605                       graph = actionDeleteRelation(parent.id)(graph);
95606                   }
95607               });
95608
95609           return graph.remove(node);
95610       };
95611
95612
95613       return action;
95614   }
95615
95616   // Connect the ways at the given nodes.
95617   //
95618   // First choose a node to be the survivor, with preference given
95619   // to an existing (not new) node.
95620   //
95621   // Tags and relation memberships of of non-surviving nodes are merged
95622   // to the survivor.
95623   //
95624   // This is the inverse of `iD.actionDisconnect`.
95625   //
95626   // Reference:
95627   //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
95628   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
95629   //
95630   function actionConnect(nodeIDs) {
95631       var action = function(graph) {
95632           var survivor;
95633           var node;
95634           var parents;
95635           var i, j;
95636
95637           // Choose a survivor node, prefer an existing (not new) node - #4974
95638           for (i = 0; i < nodeIDs.length; i++) {
95639               survivor = graph.entity(nodeIDs[i]);
95640               if (survivor.version) break;  // found one
95641           }
95642
95643           // Replace all non-surviving nodes with the survivor and merge tags.
95644           for (i = 0; i < nodeIDs.length; i++) {
95645               node = graph.entity(nodeIDs[i]);
95646               if (node.id === survivor.id) continue;
95647
95648               parents = graph.parentWays(node);
95649               for (j = 0; j < parents.length; j++) {
95650                   if (!parents[j].areAdjacent(node.id, survivor.id)) {
95651                       graph = graph.replace(parents[j].replaceNode(node.id, survivor.id));
95652                   }
95653               }
95654
95655               parents = graph.parentRelations(node);
95656               for (j = 0; j < parents.length; j++) {
95657                   graph = graph.replace(parents[j].replaceMember(node, survivor));
95658               }
95659
95660               survivor = survivor.mergeTags(node.tags);
95661               graph = actionDeleteNode(node.id)(graph);
95662           }
95663
95664           graph = graph.replace(survivor);
95665
95666           return graph;
95667       };
95668
95669
95670       action.disabled = function(graph) {
95671           var seen = {};
95672           var restrictionIDs = [];
95673           var survivor;
95674           var node, way;
95675           var relations, relation, role;
95676           var i, j, k;
95677
95678           // Choose a survivor node, prefer an existing (not new) node - #4974
95679           for (i = 0; i < nodeIDs.length; i++) {
95680               survivor = graph.entity(nodeIDs[i]);
95681               if (survivor.version) break;  // found one
95682           }
95683
95684           // 1. disable if the nodes being connected have conflicting relation roles
95685           for (i = 0; i < nodeIDs.length; i++) {
95686               node = graph.entity(nodeIDs[i]);
95687               relations = graph.parentRelations(node);
95688
95689               for (j = 0; j < relations.length; j++) {
95690                   relation = relations[j];
95691                   role = relation.memberById(node.id).role || '';
95692
95693                   // if this node is a via node in a restriction, remember for later
95694                   if (relation.isValidRestriction()) {
95695                       restrictionIDs.push(relation.id);
95696                   }
95697
95698                   if (seen[relation.id] !== undefined && seen[relation.id] !== role) {
95699                       return 'relation';
95700                   } else {
95701                       seen[relation.id] = role;
95702                   }
95703               }
95704           }
95705
95706           // gather restrictions for parent ways
95707           for (i = 0; i < nodeIDs.length; i++) {
95708               node = graph.entity(nodeIDs[i]);
95709
95710               var parents = graph.parentWays(node);
95711               for (j = 0; j < parents.length; j++) {
95712                   var parent = parents[j];
95713                   relations = graph.parentRelations(parent);
95714
95715                   for (k = 0; k < relations.length; k++) {
95716                       relation = relations[k];
95717                       if (relation.isValidRestriction()) {
95718                           restrictionIDs.push(relation.id);
95719                       }
95720                   }
95721               }
95722           }
95723
95724
95725           // test restrictions
95726           restrictionIDs = uniq(restrictionIDs);
95727           for (i = 0; i < restrictionIDs.length; i++) {
95728               relation = graph.entity(restrictionIDs[i]);
95729               if (!relation.isComplete(graph)) continue;
95730
95731               var memberWays = relation.members
95732                   .filter(function(m) { return m.type === 'way'; })
95733                   .map(function(m) { return graph.entity(m.id); });
95734
95735               memberWays = uniq(memberWays);
95736               var f = relation.memberByRole('from');
95737               var t = relation.memberByRole('to');
95738               var isUturn = (f.id === t.id);
95739
95740               // 2a. disable if connection would damage a restriction
95741               // (a key node is a node at the junction of ways)
95742               var nodes = { from: [], via: [], to: [], keyfrom: [], keyto: [] };
95743               for (j = 0; j < relation.members.length; j++) {
95744                   collectNodes(relation.members[j], nodes);
95745               }
95746
95747               nodes.keyfrom = uniq(nodes.keyfrom.filter(hasDuplicates));
95748               nodes.keyto = uniq(nodes.keyto.filter(hasDuplicates));
95749
95750               var filter = keyNodeFilter(nodes.keyfrom, nodes.keyto);
95751               nodes.from = nodes.from.filter(filter);
95752               nodes.via = nodes.via.filter(filter);
95753               nodes.to = nodes.to.filter(filter);
95754
95755               var connectFrom = false;
95756               var connectVia = false;
95757               var connectTo = false;
95758               var connectKeyFrom = false;
95759               var connectKeyTo = false;
95760
95761               for (j = 0; j < nodeIDs.length; j++) {
95762                   var n = nodeIDs[j];
95763                   if (nodes.from.indexOf(n) !== -1)    { connectFrom = true; }
95764                   if (nodes.via.indexOf(n) !== -1)     { connectVia = true; }
95765                   if (nodes.to.indexOf(n) !== -1)      { connectTo = true; }
95766                   if (nodes.keyfrom.indexOf(n) !== -1) { connectKeyFrom = true; }
95767                   if (nodes.keyto.indexOf(n) !== -1)   { connectKeyTo = true; }
95768               }
95769               if (connectFrom && connectTo && !isUturn) { return 'restriction'; }
95770               if (connectFrom && connectVia) { return 'restriction'; }
95771               if (connectTo   && connectVia) { return 'restriction'; }
95772
95773               // connecting to a key node -
95774               // if both nodes are on a member way (i.e. part of the turn restriction),
95775               // the connecting node must be adjacent to the key node.
95776               if (connectKeyFrom || connectKeyTo) {
95777                   if (nodeIDs.length !== 2) { return 'restriction'; }
95778
95779                   var n0 = null;
95780                   var n1 = null;
95781                   for (j = 0; j < memberWays.length; j++) {
95782                       way = memberWays[j];
95783                       if (way.contains(nodeIDs[0])) { n0 = nodeIDs[0]; }
95784                       if (way.contains(nodeIDs[1])) { n1 = nodeIDs[1]; }
95785                   }
95786
95787                   if (n0 && n1) {    // both nodes are part of the restriction
95788                       var ok = false;
95789                       for (j = 0; j < memberWays.length; j++) {
95790                           way = memberWays[j];
95791                           if (way.areAdjacent(n0, n1)) {
95792                               ok = true;
95793                               break;
95794                           }
95795                       }
95796                       if (!ok) {
95797                           return 'restriction';
95798                       }
95799                   }
95800               }
95801
95802               // 2b. disable if nodes being connected will destroy a member way in a restriction
95803               // (to test, make a copy and try actually connecting the nodes)
95804               for (j = 0; j < memberWays.length; j++) {
95805                   way = memberWays[j].update({});   // make copy
95806                   for (k = 0; k < nodeIDs.length; k++) {
95807                       if (nodeIDs[k] === survivor.id) continue;
95808
95809                       if (way.areAdjacent(nodeIDs[k], survivor.id)) {
95810                           way = way.removeNode(nodeIDs[k]);
95811                       } else {
95812                           way = way.replaceNode(nodeIDs[k], survivor.id);
95813                       }
95814                   }
95815                   if (way.isDegenerate()) {
95816                       return 'restriction';
95817                   }
95818               }
95819           }
95820
95821           return false;
95822
95823
95824           // if a key node appears multiple times (indexOf !== lastIndexOf) it's a FROM-VIA or TO-VIA junction
95825           function hasDuplicates(n, i, arr) {
95826               return arr.indexOf(n) !== arr.lastIndexOf(n);
95827           }
95828
95829           function keyNodeFilter(froms, tos) {
95830               return function(n) {
95831                   return froms.indexOf(n) === -1 && tos.indexOf(n) === -1;
95832               };
95833           }
95834
95835           function collectNodes(member, collection) {
95836               var entity = graph.hasEntity(member.id);
95837               if (!entity) return;
95838
95839               var role = member.role || '';
95840               if (!collection[role]) {
95841                   collection[role] = [];
95842               }
95843
95844               if (member.type === 'node') {
95845                   collection[role].push(member.id);
95846                   if (role === 'via') {
95847                       collection.keyfrom.push(member.id);
95848                       collection.keyto.push(member.id);
95849                   }
95850
95851               } else if (member.type === 'way') {
95852                   collection[role].push.apply(collection[role], entity.nodes);
95853                   if (role === 'from' || role === 'via') {
95854                       collection.keyfrom.push(entity.first());
95855                       collection.keyfrom.push(entity.last());
95856                   }
95857                   if (role === 'to' || role === 'via') {
95858                       collection.keyto.push(entity.first());
95859                       collection.keyto.push(entity.last());
95860                   }
95861               }
95862           }
95863       };
95864
95865
95866       return action;
95867   }
95868
95869   function actionCopyEntities(ids, fromGraph) {
95870       var copies = {};
95871
95872
95873       var action = function(graph) {
95874           ids.forEach(function(id) {
95875               fromGraph.entity(id).copy(fromGraph, copies);
95876           });
95877
95878           for (var id in copies) {
95879               graph = graph.replace(copies[id]);
95880           }
95881
95882           return graph;
95883       };
95884
95885
95886       action.copies = function() {
95887           return copies;
95888       };
95889
95890
95891       return action;
95892   }
95893
95894   function actionDeleteMember(relationId, memberIndex) {
95895       return function(graph) {
95896           var relation = graph.entity(relationId)
95897               .removeMember(memberIndex);
95898
95899           graph = graph.replace(relation);
95900
95901           if (relation.isDegenerate())
95902               graph = actionDeleteRelation(relation.id)(graph);
95903
95904           return graph;
95905       };
95906   }
95907
95908   function actionDiscardTags(difference) {
95909
95910       return function(graph) {
95911           function discardTags(entity) {
95912               var tags = {};
95913               var keys = Object.keys(entity.tags);
95914               var discarded = false;
95915
95916               for (var i = 0; i < keys.length; i++) {
95917                   var k = keys[i];
95918                   if (dataDiscarded[k] || !entity.tags[k]) {
95919                       discarded = true;
95920                   } else {
95921                       tags[k] = entity.tags[k];
95922                   }
95923               }
95924
95925               if (discarded) {
95926                   graph = graph.replace(entity.update({ tags: tags }));
95927               }
95928           }
95929
95930           difference.modified().forEach(discardTags);
95931           difference.created().forEach(discardTags);
95932
95933           return graph;
95934       };
95935   }
95936
95937   // Disconect the ways at the given node.
95938   //
95939   // Optionally, disconnect only the given ways.
95940   //
95941   // For testing convenience, accepts an ID to assign to the (first) new node.
95942   // Normally, this will be undefined and the way will automatically
95943   // be assigned a new ID.
95944   //
95945   // This is the inverse of `iD.actionConnect`.
95946   //
95947   // Reference:
95948   //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
95949   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
95950   //
95951   function actionDisconnect(nodeId, newNodeId) {
95952       var wayIds;
95953
95954
95955       var action = function(graph) {
95956           var node = graph.entity(nodeId);
95957           var connections = action.connections(graph);
95958
95959           connections.forEach(function(connection) {
95960               var way = graph.entity(connection.wayID);
95961               var newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
95962
95963               graph = graph.replace(newNode);
95964               if (connection.index === 0 && way.isArea()) {
95965                   // replace shared node with shared node..
95966                   graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
95967               } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
95968                   // replace closing node with new new node..
95969                   graph = graph.replace(way.unclose().addNode(newNode.id));
95970               } else {
95971                   // replace shared node with multiple new nodes..
95972                   graph = graph.replace(way.updateNode(newNode.id, connection.index));
95973               }
95974           });
95975
95976           return graph;
95977       };
95978
95979
95980       action.connections = function(graph) {
95981           var candidates = [];
95982           var keeping = false;
95983           var parentWays = graph.parentWays(graph.entity(nodeId));
95984
95985           parentWays.forEach(function(way) {
95986               if (wayIds && wayIds.indexOf(way.id) === -1) {
95987                   keeping = true;
95988                   return;
95989               }
95990               if (way.isArea() && (way.nodes[0] === nodeId)) {
95991                   candidates.push({ wayID: way.id, index: 0 });
95992               } else {
95993                   way.nodes.forEach(function(waynode, index) {
95994                       if (waynode === nodeId) {
95995                           candidates.push({ wayID: way.id, index: index });
95996                       }
95997                   });
95998               }
95999           });
96000
96001           return keeping ? candidates : candidates.slice(1);
96002       };
96003
96004
96005       action.disabled = function(graph) {
96006           var connections = action.connections(graph);
96007           if (connections.length === 0 || (wayIds && wayIds.length !== connections.length))
96008               return 'not_connected';
96009
96010           var parentWays = graph.parentWays(graph.entity(nodeId));
96011           var seenRelationIds = {};
96012           var sharedRelation;
96013
96014           parentWays.forEach(function(way) {
96015               if (wayIds && wayIds.indexOf(way.id) === -1)
96016                   return;
96017
96018               var relations = graph.parentRelations(way);
96019               relations.forEach(function(relation) {
96020                   if (relation.id in seenRelationIds) {
96021                       sharedRelation = relation;
96022                   } else {
96023                       seenRelationIds[relation.id] = true;
96024                   }
96025               });
96026           });
96027
96028           if (sharedRelation)
96029               return 'relation';
96030       };
96031
96032
96033       action.limitWays = function(_) {
96034           if (!arguments.length) return wayIds;
96035           wayIds = _;
96036           return action;
96037       };
96038
96039
96040       return action;
96041   }
96042
96043   // Join ways at the end node they share.
96044   //
96045   // This is the inverse of `iD.actionSplit`.
96046   //
96047   // Reference:
96048   //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
96049   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
96050   //
96051   function actionJoin(ids) {
96052
96053       function groupEntitiesByGeometry(graph) {
96054           var entities = ids.map(function(id) { return graph.entity(id); });
96055           return assignIn({line: []}, groupBy(entities, function(entity) { return entity.geometry(graph); }));
96056       }
96057
96058
96059       var action = function(graph) {
96060           var ways = ids.map(graph.entity, graph);
96061           var survivorID = ways[0].id;
96062
96063           // Prefer to keep an existing way.
96064           for (var i = 0; i < ways.length; i++) {
96065               if (!ways[i].isNew()) {
96066                   survivorID = ways[i].id;
96067                   break;
96068               }
96069           }
96070
96071           var sequences = osmJoinWays(ways, graph);
96072           var joined = sequences[0];
96073
96074           // We might need to reverse some of these ways before joining them.  #4688
96075           // `joined.actions` property will contain any actions we need to apply.
96076           graph = sequences.actions.reduce(function(g, action) { return action(g); }, graph);
96077
96078           var survivor = graph.entity(survivorID);
96079           survivor = survivor.update({ nodes: joined.nodes.map(function(n) { return n.id; }) });
96080           graph = graph.replace(survivor);
96081
96082           joined.forEach(function(way) {
96083               if (way.id === survivorID) return;
96084
96085               graph.parentRelations(way).forEach(function(parent) {
96086                   graph = graph.replace(parent.replaceMember(way, survivor));
96087               });
96088
96089               survivor = survivor.mergeTags(way.tags);
96090
96091               graph = graph.replace(survivor);
96092               graph = actionDeleteWay(way.id)(graph);
96093           });
96094
96095           return graph;
96096       };
96097
96098
96099       action.disabled = function(graph) {
96100           var geometries = groupEntitiesByGeometry(graph);
96101           if (ids.length < 2 || ids.length !== geometries.line.length)
96102               return 'not_eligible';
96103
96104           var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
96105           if (joined.length > 1)
96106               return 'not_adjacent';
96107
96108           // Loop through all combinations of path-pairs to check potential intersections
96109           //  between all pairs
96110           for (var i = 0; i < ids.length-1; i++) {
96111               for (var j = i+1; j < ids.length; j++) {
96112                   var path1 = graph.childNodes(graph.entity(ids[i])).map(function(e) {
96113                       return e.loc;
96114                   });
96115                   var path2 = graph.childNodes(graph.entity(ids[j])).map(function(e) {
96116                       return e.loc;
96117                   });
96118                   var intersections = geoPathIntersections(path1, path2);
96119
96120                   // Check if intersections are just nodes lying on top of each other/the line,
96121                   //  as opposed to crossing it
96122                   if (intersection(
96123                           joined[0].nodes.map(function(n) { return n.loc.toString(); }),
96124                           intersections.map(function(n) { return n.toString(); })
96125                       ).length !== intersections.length) return 'paths_intersect';
96126               }
96127           }
96128
96129           var nodeIds = joined[0].nodes.map(function(n) { return n.id; }).slice(1, -1);
96130           var relation;
96131           var tags = {};
96132           var conflicting = false;
96133
96134           joined[0].forEach(function(way) {
96135               var parents = graph.parentRelations(way);
96136               parents.forEach(function(parent) {
96137                   if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; }))
96138                       relation = parent;
96139               });
96140
96141               for (var k in way.tags) {
96142                   if (!(k in tags)) {
96143                       tags[k] = way.tags[k];
96144                   } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
96145                       conflicting = true;
96146                   }
96147               }
96148           });
96149
96150           if (relation)
96151               return 'restriction';
96152
96153           if (conflicting)
96154               return 'conflicting_tags';
96155       };
96156
96157
96158       return action;
96159   }
96160
96161   function actionMerge(ids) {
96162
96163       function groupEntitiesByGeometry(graph) {
96164           var entities = ids.map(function(id) { return graph.entity(id); });
96165           return assignIn({point: [], area: [], line: [], relation: []},
96166               groupBy(entities, function(entity) { return entity.geometry(graph); }));
96167       }
96168
96169
96170       var action = function(graph) {
96171           var geometries = groupEntitiesByGeometry(graph),
96172               target = geometries.area[0] || geometries.line[0],
96173               points = geometries.point;
96174
96175           points.forEach(function(point) {
96176               target = target.mergeTags(point.tags);
96177               graph = graph.replace(target);
96178
96179               graph.parentRelations(point).forEach(function(parent) {
96180                   graph = graph.replace(parent.replaceMember(point, target));
96181               });
96182
96183               var nodes = uniq(graph.childNodes(target)),
96184                   removeNode = point;
96185
96186               for (var i = 0; i < nodes.length; i++) {
96187                   var node = nodes[i];
96188                   if (graph.parentWays(node).length > 1 ||
96189                       graph.parentRelations(node).length ||
96190                       node.hasInterestingTags()) {
96191                       continue;
96192                   }
96193
96194                   // Found an uninteresting child node on the target way.
96195                   // Move orig point into its place to preserve point's history. #3683
96196                   graph = graph.replace(point.update({ tags: {}, loc: node.loc }));
96197                   target = target.replaceNode(node.id, point.id);
96198                   graph = graph.replace(target);
96199                   removeNode = node;
96200                   break;
96201               }
96202
96203               graph = graph.remove(removeNode);
96204           });
96205
96206           return graph;
96207       };
96208
96209
96210       action.disabled = function(graph) {
96211           var geometries = groupEntitiesByGeometry(graph);
96212           if (geometries.point.length === 0 ||
96213               (geometries.area.length + geometries.line.length) !== 1 ||
96214               geometries.relation.length !== 0)
96215               return 'not_eligible';
96216       };
96217
96218
96219       return action;
96220   }
96221
96222   // `actionMergeNodes` is just a combination of:
96223   //
96224   // 1. move all the nodes to a common location
96225   // 2. `actionConnect` them
96226
96227   function actionMergeNodes(nodeIDs, loc) {
96228
96229       // If there is a single "interesting" node, use that as the location.
96230       // Otherwise return the average location of all the nodes.
96231       function chooseLoc(graph) {
96232           if (!nodeIDs.length) return null;
96233           var sum = [0,0];
96234           var interestingCount = 0;
96235           var interestingLoc;
96236
96237           for (var i = 0; i < nodeIDs.length; i++) {
96238               var node = graph.entity(nodeIDs[i]);
96239               if (node.hasInterestingTags()) {
96240                   interestingLoc = (++interestingCount === 1) ? node.loc : null;
96241               }
96242               sum = geoVecAdd(sum, node.loc);
96243           }
96244
96245           return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length);
96246       }
96247
96248
96249       var action = function(graph) {
96250           if (nodeIDs.length < 2) return graph;
96251           var toLoc = loc;
96252           if (!toLoc) {
96253               toLoc = chooseLoc(graph);
96254           }
96255
96256           for (var i = 0; i < nodeIDs.length; i++) {
96257               var node = graph.entity(nodeIDs[i]);
96258               if (node.loc !== toLoc) {
96259                   graph = graph.replace(node.move(toLoc));
96260               }
96261           }
96262
96263           return actionConnect(nodeIDs)(graph);
96264       };
96265
96266
96267       action.disabled = function(graph) {
96268           if (nodeIDs.length < 2) return 'not_eligible';
96269
96270           for (var i = 0; i < nodeIDs.length; i++) {
96271               var entity = graph.entity(nodeIDs[i]);
96272               if (entity.type !== 'node') return 'not_eligible';
96273           }
96274
96275           return actionConnect(nodeIDs).disabled(graph);
96276       };
96277
96278       return action;
96279   }
96280
96281   function actionMergePolygon(ids, newRelationId) {
96282
96283       function groupEntities(graph) {
96284           var entities = ids.map(function (id) { return graph.entity(id); });
96285           return assignIn({
96286                   closedWay: [],
96287                   multipolygon: [],
96288                   other: []
96289               }, groupBy(entities, function(entity) {
96290                   if (entity.type === 'way' && entity.isClosed()) {
96291                       return 'closedWay';
96292                   } else if (entity.type === 'relation' && entity.isMultipolygon()) {
96293                       return 'multipolygon';
96294                   } else {
96295                       return 'other';
96296                   }
96297               }));
96298       }
96299
96300
96301       var action = function(graph) {
96302           var entities = groupEntities(graph);
96303
96304           // An array representing all the polygons that are part of the multipolygon.
96305           //
96306           // Each element is itself an array of objects with an id property, and has a
96307           // locs property which is an array of the locations forming the polygon.
96308           var polygons = entities.multipolygon.reduce(function(polygons, m) {
96309               return polygons.concat(osmJoinWays(m.members, graph));
96310           }, []).concat(entities.closedWay.map(function(d) {
96311               var member = [{id: d.id}];
96312               member.nodes = graph.childNodes(d);
96313               return member;
96314           }));
96315
96316           // contained is an array of arrays of boolean values,
96317           // where contained[j][k] is true iff the jth way is
96318           // contained by the kth way.
96319           var contained = polygons.map(function(w, i) {
96320               return polygons.map(function(d, n) {
96321                   if (i === n) return null;
96322                   return geoPolygonContainsPolygon(
96323                       map$3(d.nodes, 'loc'),
96324                       map$3(w.nodes, 'loc'));
96325               });
96326           });
96327
96328           // Sort all polygons as either outer or inner ways
96329           var members = [],
96330               outer = true;
96331
96332           while (polygons.length) {
96333               extractUncontained(polygons);
96334               polygons = polygons.filter(isContained);
96335               contained = contained.filter(isContained).map(filterContained);
96336           }
96337
96338           function isContained(d, i) {
96339               return some(contained[i]);
96340           }
96341
96342           function filterContained(d) {
96343               return d.filter(isContained);
96344           }
96345
96346           function extractUncontained(polygons) {
96347               polygons.forEach(function(d, i) {
96348                   if (!isContained(d, i)) {
96349                       d.forEach(function(member) {
96350                           members.push({
96351                               type: 'way',
96352                               id: member.id,
96353                               role: outer ? 'outer' : 'inner'
96354                           });
96355                       });
96356                   }
96357               });
96358               outer = !outer;
96359           }
96360
96361           // Move all tags to one relation
96362           var relation = entities.multipolygon[0] ||
96363               osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
96364
96365           entities.multipolygon.slice(1).forEach(function(m) {
96366               relation = relation.mergeTags(m.tags);
96367               graph = graph.remove(m);
96368           });
96369
96370           entities.closedWay.forEach(function(way) {
96371               function isThisOuter(m) {
96372                   return m.id === way.id && m.role !== 'inner';
96373               }
96374               if (members.some(isThisOuter)) {
96375                   relation = relation.mergeTags(way.tags);
96376                   graph = graph.replace(way.update({ tags: {} }));
96377               }
96378           });
96379
96380           return graph.replace(relation.update({
96381               members: members,
96382               tags: omit(relation.tags, 'area')
96383           }));
96384       };
96385
96386
96387       action.disabled = function(graph) {
96388           var entities = groupEntities(graph);
96389           if (entities.other.length > 0 ||
96390               entities.closedWay.length + entities.multipolygon.length < 2)
96391               return 'not_eligible';
96392           if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
96393               return 'incomplete_relation';
96394       };
96395
96396
96397       return action;
96398   }
96399
96400   // Text diff algorithm following Hunt and McIlroy 1976.
96401   // J. W. Hunt and M. D. McIlroy, An algorithm for differential file
96402   // comparison, Bell Telephone Laboratories CSTR #41 (1976)
96403   // http://www.cs.dartmouth.edu/~doug/
96404   //
96405   // Expects two arrays of strings.
96406   function LCS(file1, file2) {
96407     var equivalenceClasses;
96408     var file2indices;
96409     var newCandidate;
96410     var candidates;
96411     var line;
96412     var c, i, j, jX, r, s;
96413
96414     equivalenceClasses = {};
96415     for (j = 0; j < file2.length; j++) {
96416       line = file2[j];
96417       if (equivalenceClasses[line]) {
96418         equivalenceClasses[line].push(j);
96419       } else {
96420         equivalenceClasses[line] = [j];
96421       }
96422     }
96423
96424     candidates = [
96425       { file1index: -1, file2index: -1, chain: null }
96426     ];
96427
96428     for (i = 0; i < file1.length; i++) {
96429       line = file1[i];
96430       file2indices = equivalenceClasses[line] || [];
96431
96432       r = 0;
96433       c = candidates[0];
96434
96435       for (jX = 0; jX < file2indices.length; jX++) {
96436         j = file2indices[jX];
96437
96438         for (s = r; s < candidates.length; s++) {
96439           if ((candidates[s].file2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].file2index > j))) {
96440             break;
96441           }
96442         }
96443
96444         if (s < candidates.length) {
96445           newCandidate = { file1index: i, file2index: j, chain: candidates[s] };
96446           if (r === candidates.length) {
96447             candidates.push(c);
96448           } else {
96449             candidates[r] = c;
96450           }
96451           r = s + 1;
96452           c = newCandidate;
96453           if (r === candidates.length) {
96454             break; // no point in examining further (j)s
96455           }
96456         }
96457       }
96458
96459       candidates[r] = c;
96460     }
96461
96462     // At this point, we know the LCS: it's in the reverse of the
96463     // linked-list through .chain of candidates[candidates.length - 1].
96464
96465     return candidates[candidates.length - 1];
96466   }
96467
96468
96469   // We apply the LCS to give a simple representation of the
96470   // offsets and lengths of mismatched chunks in the input
96471   // files. This is used by diff3MergeIndices below.
96472   function diffIndices(file1, file2) {
96473     var result = [];
96474     var tail1 = file1.length;
96475     var tail2 = file2.length;
96476
96477     for (var candidate = LCS(file1, file2);
96478        candidate !== null;
96479        candidate = candidate.chain)
96480     {
96481       var mismatchLength1 = tail1 - candidate.file1index - 1;
96482       var mismatchLength2 = tail2 - candidate.file2index - 1;
96483       tail1 = candidate.file1index;
96484       tail2 = candidate.file2index;
96485
96486       if (mismatchLength1 || mismatchLength2) {
96487         result.push({
96488           file1: [tail1 + 1, mismatchLength1],
96489           file2: [tail2 + 1, mismatchLength2]
96490         });
96491       }
96492     }
96493
96494     result.reverse();
96495     return result;
96496   }
96497
96498
96499   // Given three files, A, O, and B, where both A and B are
96500   // independently derived from O, returns a fairly complicated
96501   // internal representation of merge decisions it's taken. The
96502   // interested reader may wish to consult
96503   //
96504   // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
96505   // 'A Formal Investigation of ' In Arvind and Prasad,
96506   // editors, Foundations of Software Technology and Theoretical
96507   // Computer Science (FSTTCS), December 2007.
96508   //
96509   // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
96510   function diff3MergeIndices(a, o, b) {
96511     var i;
96512     var m1 = diffIndices(o, a);
96513     var m2 = diffIndices(o, b);
96514
96515     var hunks = [];
96516     function addHunk(h, side) {
96517       hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
96518     }
96519     for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); }
96520     for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); }
96521     hunks.sort(function (x, y) { return x[0] - y[0]; });
96522
96523     var result = [];
96524     var commonOffset = 0;
96525     function copyCommon(targetOffset) {
96526       if (targetOffset > commonOffset) {
96527         result.push([1, commonOffset, targetOffset - commonOffset]);
96528         commonOffset = targetOffset;
96529       }
96530     }
96531
96532     for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) {
96533       var firstHunkIndex = hunkIndex;
96534       var hunk = hunks[hunkIndex];
96535       var regionLhs = hunk[0];
96536       var regionRhs = regionLhs + hunk[2];
96537       while (hunkIndex < hunks.length - 1) {
96538         var maybeOverlapping = hunks[hunkIndex + 1];
96539         var maybeLhs = maybeOverlapping[0];
96540         if (maybeLhs > regionRhs) {
96541           break;
96542         }
96543         regionRhs = Math.max(regionRhs, maybeLhs + maybeOverlapping[2]);
96544         hunkIndex++;
96545       }
96546
96547       copyCommon(regionLhs);
96548       if (firstHunkIndex === hunkIndex) {
96549         // The 'overlap' was only one hunk long, meaning that
96550         // there's no conflict here. Either a and o were the
96551         // same, or b and o were the same.
96552         if (hunk[4] > 0) {
96553           result.push([hunk[1], hunk[3], hunk[4]]);
96554         }
96555       } else {
96556         // A proper conflict. Determine the extents of the
96557         // regions involved from a, o and b. Effectively merge
96558         // all the hunks on the left into one giant hunk, and
96559         // do the same for the right; then, correct for skew
96560         // in the regions of o that each side changed, and
96561         // report appropriate spans for the three sides.
96562         var regions = {
96563           0: [a.length, -1, o.length, -1],
96564           2: [b.length, -1, o.length, -1]
96565         };
96566         for (i = firstHunkIndex; i <= hunkIndex; i++) {
96567           hunk = hunks[i];
96568           var side = hunk[1];
96569           var r = regions[side];
96570           var oLhs = hunk[0];
96571           var oRhs = oLhs + hunk[2];
96572           var abLhs = hunk[3];
96573           var abRhs = abLhs + hunk[4];
96574           r[0] = Math.min(abLhs, r[0]);
96575           r[1] = Math.max(abRhs, r[1]);
96576           r[2] = Math.min(oLhs, r[2]);
96577           r[3] = Math.max(oRhs, r[3]);
96578         }
96579         var aLhs = regions[0][0] + (regionLhs - regions[0][2]);
96580         var aRhs = regions[0][1] + (regionRhs - regions[0][3]);
96581         var bLhs = regions[2][0] + (regionLhs - regions[2][2]);
96582         var bRhs = regions[2][1] + (regionRhs - regions[2][3]);
96583         result.push([-1,
96584                      aLhs,      aRhs      - aLhs,
96585                      regionLhs, regionRhs - regionLhs,
96586                      bLhs,      bRhs      - bLhs]);
96587       }
96588       commonOffset = regionRhs;
96589     }
96590
96591     copyCommon(o.length);
96592     return result;
96593   }
96594
96595
96596   // Applies the output of diff3MergeIndices to actually
96597   // construct the merged file; the returned result alternates
96598   // between 'ok' and 'conflict' blocks.
96599   function diff3Merge(a, o, b, excludeFalseConflicts) {
96600     var result = [];
96601     var files = [a, o, b];
96602     var indices = diff3MergeIndices(a, o, b);
96603
96604     var okLines = [];
96605     function flushOk() {
96606       if (okLines.length) {
96607         result.push({ok: okLines});
96608       }
96609       okLines = [];
96610     }
96611     function pushOk(xs) {
96612       for (var j = 0; j < xs.length; j++) {
96613         okLines.push(xs[j]);
96614       }
96615     }
96616
96617     function isTrueConflict(rec) {
96618       if (rec[2] !== rec[6]) return true;
96619       var aoff = rec[1];
96620       var boff = rec[5];
96621       for (var j = 0; j < rec[2]; j++) {
96622         if (a[j + aoff] !== b[j + boff]) {
96623           return true;
96624         }
96625       }
96626       return false;
96627     }
96628
96629     for (var i = 0; i < indices.length; i++) {
96630       var x = indices[i];
96631       var side = x[0];
96632       if (side === -1) {
96633         if (excludeFalseConflicts && !isTrueConflict(x)) {
96634           pushOk(files[0].slice(x[1], x[1] + x[2]));
96635         } else {
96636           flushOk();
96637           result.push({
96638             conflict: {
96639               a: a.slice(x[1], x[1] + x[2]),
96640               aIndex: x[1],
96641               o: o.slice(x[3], x[3] + x[4]),
96642               oIndex: x[3],
96643               b: b.slice(x[5], x[5] + x[6]),
96644               bIndex: x[5]
96645             }
96646           });
96647         }
96648       } else {
96649         pushOk(files[side].slice(x[1], x[1] + x[2]));
96650       }
96651     }
96652
96653     flushOk();
96654     return result;
96655   }
96656
96657   function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
96658       var _option = 'safe';  // 'safe', 'force_local', 'force_remote'
96659       var _conflicts = [];
96660
96661
96662       function user(d) {
96663           return isFunction(formatUser) ? formatUser(d) : d;
96664       }
96665
96666
96667       function mergeLocation(remote, target) {
96668           function pointEqual(a, b) {
96669               var epsilon = 1e-6;
96670               return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon);
96671           }
96672
96673           if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) {
96674               return target;
96675           }
96676           if (_option === 'force_remote') {
96677               return target.update({loc: remote.loc});
96678           }
96679
96680           _conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
96681           return target;
96682       }
96683
96684
96685       function mergeNodes(base, remote, target) {
96686           if (_option === 'force_local' || isEqual(target.nodes, remote.nodes)) {
96687               return target;
96688           }
96689           if (_option === 'force_remote') {
96690               return target.update({nodes: remote.nodes});
96691           }
96692
96693           var ccount = _conflicts.length;
96694           var o = base.nodes || [];
96695           var a = target.nodes || [];
96696           var b = remote.nodes || [];
96697           var nodes = [];
96698           var hunks = diff3Merge(a, o, b, true);
96699
96700           for (var i = 0; i < hunks.length; i++) {
96701               var hunk = hunks[i];
96702               if (hunk.ok) {
96703                   nodes.push.apply(nodes, hunk.ok);
96704               } else {
96705                   // for all conflicts, we can assume c.a !== c.b
96706                   // because `diff3Merge` called with `true` option to exclude false conflicts..
96707                   var c = hunk.conflict;
96708                   if (isEqual(c.o, c.a)) {  // only changed remotely
96709                       nodes.push.apply(nodes, c.b);
96710                   } else if (isEqual(c.o, c.b)) {  // only changed locally
96711                       nodes.push.apply(nodes, c.a);
96712                   } else {       // changed both locally and remotely
96713                       _conflicts.push(t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) }));
96714                       break;
96715                   }
96716               }
96717           }
96718
96719           return (_conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
96720       }
96721
96722
96723       function mergeChildren(targetWay, children, updates, graph) {
96724           function isUsed(node, targetWay) {
96725               var parentWays = map$3(graph.parentWays(node), 'id');
96726               return node.hasInterestingTags() ||
96727                   without(parentWays, targetWay.id).length > 0 ||
96728                   graph.parentRelations(node).length > 0;
96729           }
96730
96731           var ccount = _conflicts.length;
96732
96733           for (var i = 0; i < children.length; i++) {
96734               var id = children[i];
96735               var node = graph.hasEntity(id);
96736
96737               // remove unused childNodes..
96738               if (targetWay.nodes.indexOf(id) === -1) {
96739                   if (node && !isUsed(node, targetWay)) {
96740                       updates.removeIds.push(id);
96741                   }
96742                   continue;
96743               }
96744
96745               // restore used childNodes..
96746               var local = localGraph.hasEntity(id);
96747               var remote = remoteGraph.hasEntity(id);
96748               var target;
96749
96750               if (_option === 'force_remote' && remote && remote.visible) {
96751                   updates.replacements.push(remote);
96752
96753               } else if (_option === 'force_local' && local) {
96754                   target = osmEntity(local);
96755                   if (remote) {
96756                       target = target.update({ version: remote.version });
96757                   }
96758                   updates.replacements.push(target);
96759
96760               } else if (_option === 'safe' && local && remote && local.version !== remote.version) {
96761                   target = osmEntity(local, { version: remote.version });
96762                   if (remote.visible) {
96763                       target = mergeLocation(remote, target);
96764                   } else {
96765                       _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
96766                   }
96767
96768                   if (_conflicts.length !== ccount) break;
96769                   updates.replacements.push(target);
96770               }
96771           }
96772
96773           return targetWay;
96774       }
96775
96776
96777       function updateChildren(updates, graph) {
96778           for (var i = 0; i < updates.replacements.length; i++) {
96779               graph = graph.replace(updates.replacements[i]);
96780           }
96781           if (updates.removeIds.length) {
96782               graph = actionDeleteMultiple(updates.removeIds)(graph);
96783           }
96784           return graph;
96785       }
96786
96787
96788       function mergeMembers(remote, target) {
96789           if (_option === 'force_local' || isEqual(target.members, remote.members)) {
96790               return target;
96791           }
96792           if (_option === 'force_remote') {
96793               return target.update({members: remote.members});
96794           }
96795
96796           _conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
96797           return target;
96798       }
96799
96800
96801       function mergeTags(base, remote, target) {
96802           function ignoreKey(k) {
96803               return dataDiscarded[k];
96804           }
96805
96806           if (_option === 'force_local' || isEqual(target.tags, remote.tags)) {
96807               return target;
96808           }
96809           if (_option === 'force_remote') {
96810               return target.update({tags: remote.tags});
96811           }
96812
96813           var ccount = _conflicts.length;
96814           var o = base.tags || {};
96815           var a = target.tags || {};
96816           var b = remote.tags || {};
96817           var keys = reject(union(keys$1(o), keys$1(a), keys$1(b)), ignoreKey);
96818           var tags = clone(a);
96819           var changed = false;
96820
96821           for (var i = 0; i < keys.length; i++) {
96822               var k = keys[i];
96823
96824               if (o[k] !== b[k] && a[k] !== b[k]) {    // changed remotely..
96825                   if (o[k] !== a[k]) {      // changed locally..
96826                       _conflicts.push(t('merge_remote_changes.conflict.tags',
96827                           { tag: k, local: a[k], remote: b[k], user: user(remote.user) }));
96828
96829                   } else {                  // unchanged locally, accept remote change..
96830                       if (b.hasOwnProperty(k)) {
96831                           tags[k] = b[k];
96832                       } else {
96833                           delete tags[k];
96834                       }
96835                       changed = true;
96836                   }
96837               }
96838           }
96839
96840           return (changed && _conflicts.length === ccount) ? target.update({tags: tags}) : target;
96841       }
96842
96843
96844       //  `graph.base()` is the common ancestor of the two graphs.
96845       //  `localGraph` contains user's edits up to saving
96846       //  `remoteGraph` contains remote edits to modified nodes
96847       //  `graph` must be a descendent of `localGraph` and may include
96848       //      some conflict resolution actions performed on it.
96849       //
96850       //                  --- ... --- `localGraph` -- ... -- `graph`
96851       //                 /
96852       //  `graph.base()` --- ... --- `remoteGraph`
96853       //
96854       var action = function(graph) {
96855           var updates = { replacements: [], removeIds: [] };
96856           var base = graph.base().entities[id];
96857           var local = localGraph.entity(id);
96858           var remote = remoteGraph.entity(id);
96859           var target = osmEntity(local, { version: remote.version });
96860
96861           // delete/undelete
96862           if (!remote.visible) {
96863               if (_option === 'force_remote') {
96864                   return actionDeleteMultiple([id])(graph);
96865
96866               } else if (_option === 'force_local') {
96867                   if (target.type === 'way') {
96868                       target = mergeChildren(target, uniq(local.nodes), updates, graph);
96869                       graph = updateChildren(updates, graph);
96870                   }
96871                   return graph.replace(target);
96872
96873               } else {
96874                   _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
96875                   return graph;  // do nothing
96876               }
96877           }
96878
96879           // merge
96880           if (target.type === 'node') {
96881               target = mergeLocation(remote, target);
96882
96883           } else if (target.type === 'way') {
96884               // pull in any child nodes that may not be present locally..
96885               graph.rebase(remoteGraph.childNodes(remote), [graph], false);
96886               target = mergeNodes(base, remote, target);
96887               target = mergeChildren(target, union(local.nodes, remote.nodes), updates, graph);
96888
96889           } else if (target.type === 'relation') {
96890               target = mergeMembers(remote, target);
96891           }
96892
96893           target = mergeTags(base, remote, target);
96894
96895           if (!_conflicts.length) {
96896               graph = updateChildren(updates, graph).replace(target);
96897           }
96898
96899           return graph;
96900       };
96901
96902
96903       action.withOption = function(opt) {
96904           _option = opt;
96905           return action;
96906       };
96907
96908
96909       action.conflicts = function() {
96910           return _conflicts;
96911       };
96912
96913
96914       return action;
96915   }
96916
96917   // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
96918   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
96919   function actionMove(moveIds, tryDelta, projection, cache) {
96920       var _delta = tryDelta;
96921
96922       function setupCache(graph) {
96923           function canMove(nodeId) {
96924               // Allow movement of any node that is in the selectedIDs list..
96925               if (moveIds.indexOf(nodeId) !== -1) return true;
96926
96927               // Allow movement of a vertex where 2 ways meet..
96928               var parents = map$3(graph.parentWays(graph.entity(nodeId)), 'id');
96929               if (parents.length < 3) return true;
96930
96931               // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
96932               var parentsMoving = every(parents, function(id) { return cache.moving[id]; });
96933               if (!parentsMoving) delete cache.moving[nodeId];
96934
96935               return parentsMoving;
96936           }
96937
96938           function cacheEntities(ids) {
96939               for (var i = 0; i < ids.length; i++) {
96940                   var id = ids[i];
96941                   if (cache.moving[id]) continue;
96942                   cache.moving[id] = true;
96943
96944                   var entity = graph.hasEntity(id);
96945                   if (!entity) continue;
96946
96947                   if (entity.type === 'node') {
96948                       cache.nodes.push(id);
96949                       cache.startLoc[id] = entity.loc;
96950                   } else if (entity.type === 'way') {
96951                       cache.ways.push(id);
96952                       cacheEntities(entity.nodes);
96953                   } else {
96954                       cacheEntities(entity.members.map(function(member) {
96955                           return member.id;
96956                       }));
96957                   }
96958               }
96959           }
96960
96961           function cacheIntersections(ids) {
96962               function isEndpoint(way, id) {
96963                   return !way.isClosed() && !!way.affix(id);
96964               }
96965
96966               for (var i = 0; i < ids.length; i++) {
96967                   var id = ids[i];
96968
96969                   // consider only intersections with 1 moved and 1 unmoved way.
96970                   var childNodes = graph.childNodes(graph.entity(id));
96971                   for (var j = 0; j < childNodes.length; j++) {
96972                       var node = childNodes[j];
96973                       var parents = graph.parentWays(node);
96974                       if (parents.length !== 2) continue;
96975
96976                       var moved = graph.entity(id);
96977                       var unmoved = null;
96978                       for (var k = 0; k < parents.length; k++) {
96979                           var way = parents[k];
96980                           if (!cache.moving[way.id]) {
96981                               unmoved = way;
96982                               break;
96983                           }
96984                       }
96985                       if (!unmoved) continue;
96986
96987                       // exclude ways that are overly connected..
96988                       if (intersection(moved.nodes, unmoved.nodes).length > 2) continue;
96989                       if (moved.isArea() || unmoved.isArea()) continue;
96990
96991                       cache.intersections.push({
96992                           nodeId: node.id,
96993                           movedId: moved.id,
96994                           unmovedId: unmoved.id,
96995                           movedIsEP: isEndpoint(moved, node.id),
96996                           unmovedIsEP: isEndpoint(unmoved, node.id)
96997                       });
96998                   }
96999               }
97000           }
97001
97002
97003           if (!cache) {
97004               cache = {};
97005           }
97006           if (!cache.ok) {
97007               cache.moving = {};
97008               cache.intersections = [];
97009               cache.replacedVertex = {};
97010               cache.startLoc = {};
97011               cache.nodes = [];
97012               cache.ways = [];
97013
97014               cacheEntities(moveIds);
97015               cacheIntersections(cache.ways);
97016               cache.nodes = filter(cache.nodes, canMove);
97017
97018               cache.ok = true;
97019           }
97020       }
97021
97022
97023       // Place a vertex where the moved vertex used to be, to preserve way shape..
97024       //
97025       //  Start:
97026       //      b ---- e
97027       //     / \
97028       //    /   \
97029       //   /     \
97030       //  a       c
97031       //
97032       //      *               node '*' added to preserve shape
97033       //     / \
97034       //    /   b ---- e      way `b,e` moved here:
97035       //   /     \
97036       //  a       c
97037       //
97038       //
97039       function replaceMovedVertex(nodeId, wayId, graph, delta) {
97040           var way = graph.entity(wayId);
97041           var moved = graph.entity(nodeId);
97042           var movedIndex = way.nodes.indexOf(nodeId);
97043           var len, prevIndex, nextIndex;
97044
97045           if (way.isClosed()) {
97046               len = way.nodes.length - 1;
97047               prevIndex = (movedIndex + len - 1) % len;
97048               nextIndex = (movedIndex + len + 1) % len;
97049           } else {
97050               len = way.nodes.length;
97051               prevIndex = movedIndex - 1;
97052               nextIndex = movedIndex + 1;
97053           }
97054
97055           var prev = graph.hasEntity(way.nodes[prevIndex]);
97056           var next = graph.hasEntity(way.nodes[nextIndex]);
97057
97058           // Don't add orig vertex at endpoint..
97059           if (!prev || !next) return graph;
97060
97061           var key = wayId + '_' + nodeId;
97062           var orig = cache.replacedVertex[key];
97063           if (!orig) {
97064               orig = osmNode();
97065               cache.replacedVertex[key] = orig;
97066               cache.startLoc[orig.id] = cache.startLoc[nodeId];
97067           }
97068
97069           var start, end;
97070           if (delta) {
97071               start = projection(cache.startLoc[nodeId]);
97072               end = projection.invert(geoVecAdd(start, delta));
97073           } else {
97074               end = cache.startLoc[nodeId];
97075           }
97076           orig = orig.move(end);
97077
97078           var angle = Math.abs(geoAngle(orig, prev, projection) -
97079                   geoAngle(orig, next, projection)) * 180 / Math.PI;
97080
97081           // Don't add orig vertex if it would just make a straight line..
97082           if (angle > 175 && angle < 185) return graph;
97083
97084           // moving forward or backward along way?
97085           var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
97086           var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection);
97087           var d1 = geoPathLength(p1);
97088           var d2 = geoPathLength(p2);
97089           var insertAt = (d1 <= d2) ? movedIndex : nextIndex;
97090
97091           // moving around closed loop?
97092           if (way.isClosed() && insertAt === 0) insertAt = len;
97093
97094           way = way.addNode(orig.id, insertAt);
97095           return graph.replace(orig).replace(way);
97096       }
97097
97098
97099       // Remove duplicate vertex that might have been added by
97100       // replaceMovedVertex.  This is done after the unzorro checks.
97101       function removeDuplicateVertices(wayId, graph) {
97102           var way = graph.entity(wayId);
97103           var epsilon = 1e-6;
97104           var prev, curr;
97105
97106           function isInteresting(node, graph) {
97107               return graph.parentWays(node).length > 1 ||
97108                   graph.parentRelations(node).length ||
97109                   node.hasInterestingTags();
97110           }
97111
97112           for (var i = 0; i < way.nodes.length; i++) {
97113               curr = graph.entity(way.nodes[i]);
97114
97115               if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) {
97116                   if (!isInteresting(prev, graph)) {
97117                       way = way.removeNode(prev.id);
97118                       graph = graph.replace(way).remove(prev);
97119                   } else if (!isInteresting(curr, graph)) {
97120                       way = way.removeNode(curr.id);
97121                       graph = graph.replace(way).remove(curr);
97122                   }
97123               }
97124
97125               prev = curr;
97126           }
97127
97128           return graph;
97129       }
97130
97131
97132       // Reorder nodes around intersections that have moved..
97133       //
97134       //  Start:                way1.nodes: b,e         (moving)
97135       //  a - b - c ----- d     way2.nodes: a,b,c,d     (static)
97136       //      |                 vertex: b
97137       //      e                 isEP1: true,  isEP2, false
97138       //
97139       //  way1 `b,e` moved here:
97140       //  a ----- c = b - d
97141       //              |
97142       //              e
97143       //
97144       //  reorder nodes         way1.nodes: b,e
97145       //  a ----- c - b - d     way2.nodes: a,c,b,d
97146       //              |
97147       //              e
97148       //
97149       function unZorroIntersection(intersection, graph) {
97150           var vertex = graph.entity(intersection.nodeId);
97151           var way1 = graph.entity(intersection.movedId);
97152           var way2 = graph.entity(intersection.unmovedId);
97153           var isEP1 = intersection.movedIsEP;
97154           var isEP2 = intersection.unmovedIsEP;
97155
97156           // don't move the vertex if it is the endpoint of both ways.
97157           if (isEP1 && isEP2) return graph;
97158
97159           var nodes1 = without(graph.childNodes(way1), vertex);
97160           var nodes2 = without(graph.childNodes(way2), vertex);
97161
97162           if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
97163           if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
97164
97165           var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
97166           var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
97167           var loc;
97168
97169           // snap vertex to nearest edge (or some point between them)..
97170           if (!isEP1 && !isEP2) {
97171               var epsilon = 1e-6, maxIter = 10;
97172               for (var i = 0; i < maxIter; i++) {
97173                   loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
97174                   edge1 = geoChooseEdge(nodes1, projection(loc), projection);
97175                   edge2 = geoChooseEdge(nodes2, projection(loc), projection);
97176                   if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
97177               }
97178           } else if (!isEP1) {
97179               loc = edge1.loc;
97180           } else {
97181               loc = edge2.loc;
97182           }
97183
97184           graph = graph.replace(vertex.move(loc));
97185
97186           // if zorro happened, reorder nodes..
97187           if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
97188               way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
97189               graph = graph.replace(way1);
97190           }
97191           if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
97192               way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
97193               graph = graph.replace(way2);
97194           }
97195
97196           return graph;
97197       }
97198
97199
97200       function cleanupIntersections(graph) {
97201           for (var i = 0; i < cache.intersections.length; i++) {
97202               var obj = cache.intersections[i];
97203               graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
97204               graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
97205               graph = unZorroIntersection(obj, graph);
97206               graph = removeDuplicateVertices(obj.movedId, graph);
97207               graph = removeDuplicateVertices(obj.unmovedId, graph);
97208           }
97209
97210           return graph;
97211       }
97212
97213
97214       // check if moving way endpoint can cross an unmoved way, if so limit delta..
97215       function limitDelta(graph) {
97216           function moveNode(loc) {
97217               return geoVecAdd(projection(loc), _delta);
97218           }
97219
97220           for (var i = 0; i < cache.intersections.length; i++) {
97221               var obj = cache.intersections[i];
97222
97223               // Don't limit movement if this is vertex joins 2 endpoints..
97224               if (obj.movedIsEP && obj.unmovedIsEP) continue;
97225               // Don't limit movement if this vertex is not an endpoint anyway..
97226               if (!obj.movedIsEP) continue;
97227
97228               var node = graph.entity(obj.nodeId);
97229               var start = projection(node.loc);
97230               var end = geoVecAdd(start, _delta);
97231               var movedNodes = graph.childNodes(graph.entity(obj.movedId));
97232               var movedPath = map$3(map$3(movedNodes, 'loc'), moveNode);
97233               var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
97234               var unmovedPath = map$3(map$3(unmovedNodes, 'loc'), projection);
97235               var hits = geoPathIntersections(movedPath, unmovedPath);
97236
97237               for (var j = 0; i < hits.length; i++) {
97238                   if (isEqual(hits[j], end)) continue;
97239                   var edge = geoChooseEdge(unmovedNodes, end, projection);
97240                   _delta = geoVecSubtract(projection(edge.loc), start);
97241               }
97242           }
97243       }
97244
97245
97246       var action = function(graph) {
97247           if (_delta[0] === 0 && _delta[1] === 0) return graph;
97248
97249           setupCache(graph);
97250
97251           if (cache.intersections.length) {
97252               limitDelta(graph);
97253           }
97254
97255           for (var i = 0; i < cache.nodes.length; i++) {
97256               var node = graph.entity(cache.nodes[i]);
97257               var start = projection(node.loc);
97258               var end = geoVecAdd(start, _delta);
97259               graph = graph.replace(node.move(projection.invert(end)));
97260           }
97261
97262           if (cache.intersections.length) {
97263               graph = cleanupIntersections(graph);
97264           }
97265
97266           return graph;
97267       };
97268
97269
97270       action.delta = function() {
97271           return _delta;
97272       };
97273
97274
97275       return action;
97276   }
97277
97278   function actionMoveNode(nodeID, toLoc) {
97279
97280       var action = function(graph, t) {
97281           if (t === null || !isFinite(t)) t = 1;
97282           t = Math.min(Math.max(+t, 0), 1);
97283
97284           var node = graph.entity(nodeID);
97285           return graph.replace(
97286               node.move(geoVecInterp(node.loc, toLoc, t))
97287           );
97288       };
97289
97290       action.transitionable = true;
97291
97292       return action;
97293   }
97294
97295   function actionNoop() {
97296       return function(graph) {
97297           return graph;
97298       };
97299   }
97300
97301   /*
97302    * Based on https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/potlatch2/tools/Quadrilateralise.as
97303    */
97304   function actionOrthogonalize(wayId, projection) {
97305       var threshold = 12, // degrees within right or straight to alter
97306           lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180),
97307           upperThreshold = Math.cos(threshold * Math.PI / 180);
97308
97309
97310       var action = function(graph, t) {
97311           if (t === null || !isFinite(t)) t = 1;
97312           t = Math.min(Math.max(+t, 0), 1);
97313
97314           var way = graph.entity(wayId),
97315               nodes = graph.childNodes(way),
97316               points = uniq(nodes).map(function(n) { return projection(n.loc); }),
97317               corner = {i: 0, dotp: 1},
97318               epsilon = 1e-4,
97319               node, loc, score, motions, i, j;
97320
97321           if (points.length === 3) {   // move only one vertex for right triangle
97322               for (i = 0; i < 1000; i++) {
97323                   motions = points.map(calcMotion);
97324                   points[corner.i] = addPoints(points[corner.i], motions[corner.i]);
97325                   score = corner.dotp;
97326                   if (score < epsilon) {
97327                       break;
97328                   }
97329               }
97330
97331               node = graph.entity(nodes[corner.i].id);
97332               loc = projection.invert(points[corner.i]);
97333               graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
97334
97335           } else {
97336               var best,
97337                   originalPoints = clone(points);
97338               score = Infinity;
97339
97340               for (i = 0; i < 1000; i++) {
97341                   motions = points.map(calcMotion);
97342                   for (j = 0; j < motions.length; j++) {
97343                       points[j] = addPoints(points[j],motions[j]);
97344                   }
97345                   var newScore = squareness(points);
97346                   if (newScore < score) {
97347                       best = clone(points);
97348                       score = newScore;
97349                   }
97350                   if (score < epsilon) {
97351                       break;
97352                   }
97353               }
97354
97355               points = best;
97356
97357               for (i = 0; i < points.length; i++) {
97358                   // only move the points that actually moved
97359                   if (originalPoints[i][0] !== points[i][0] || originalPoints[i][1] !== points[i][1]) {
97360                       loc = projection.invert(points[i]);
97361                       node = graph.entity(nodes[i].id);
97362                       graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
97363                   }
97364               }
97365
97366               // remove empty nodes on straight sections
97367               for (i = 0; t === 1 && i < points.length; i++) {
97368                   node = graph.entity(nodes[i].id);
97369
97370                   if (graph.parentWays(node).length > 1 ||
97371                       graph.parentRelations(node).length ||
97372                       node.hasInterestingTags()) {
97373                       continue;
97374                   }
97375
97376                   var dotp = normalizedDotProduct(i, points);
97377                   if (dotp < -1 + epsilon) {
97378                       graph = actionDeleteNode(node.id)(graph);
97379                   }
97380               }
97381           }
97382
97383           return graph;
97384
97385
97386           function calcMotion(b, i, array) {
97387               var a = array[(i - 1 + array.length) % array.length],
97388                   c = array[(i + 1) % array.length],
97389                   p = subtractPoints(a, b),
97390                   q = subtractPoints(c, b),
97391                   scale, dotp;
97392
97393               scale = 2 * Math.min(geoVecLength(p, [0, 0]), geoVecLength(q, [0, 0]));
97394               p = normalizePoint(p, 1.0);
97395               q = normalizePoint(q, 1.0);
97396
97397               dotp = filterDotProduct(p[0] * q[0] + p[1] * q[1]);
97398
97399               // nasty hack to deal with almost-straight segments (angle is closer to 180 than to 90/270).
97400               if (array.length > 3) {
97401                   if (dotp < -0.707106781186547) {
97402                       dotp += 1.0;
97403                   }
97404               } else if (dotp && Math.abs(dotp) < corner.dotp) {
97405                   corner.i = i;
97406                   corner.dotp = Math.abs(dotp);
97407               }
97408
97409               return normalizePoint(addPoints(p, q), 0.1 * dotp * scale);
97410           }
97411       };
97412
97413
97414       function squareness(points) {
97415           return points.reduce(function(sum, val, i, array) {
97416               var dotp = normalizedDotProduct(i, array);
97417
97418               dotp = filterDotProduct(dotp);
97419               return sum + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
97420           }, 0);
97421       }
97422
97423
97424       function normalizedDotProduct(i, points) {
97425           var a = points[(i - 1 + points.length) % points.length],
97426               b = points[i],
97427               c = points[(i + 1) % points.length],
97428               p = subtractPoints(a, b),
97429               q = subtractPoints(c, b);
97430
97431           p = normalizePoint(p, 1.0);
97432           q = normalizePoint(q, 1.0);
97433
97434           return p[0] * q[0] + p[1] * q[1];
97435       }
97436
97437
97438       function subtractPoints(a, b) {
97439           return [a[0] - b[0], a[1] - b[1]];
97440       }
97441
97442
97443       function addPoints(a, b) {
97444           return [a[0] + b[0], a[1] + b[1]];
97445       }
97446
97447
97448       function normalizePoint(point, scale) {
97449           var vector = [0, 0];
97450           var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
97451           if (length !== 0) {
97452               vector[0] = point[0] / length;
97453               vector[1] = point[1] / length;
97454           }
97455
97456           vector[0] *= scale;
97457           vector[1] *= scale;
97458
97459           return vector;
97460       }
97461
97462
97463       function filterDotProduct(dotp) {
97464           if (lowerThreshold > Math.abs(dotp) || Math.abs(dotp) > upperThreshold) {
97465               return dotp;
97466           }
97467
97468           return 0;
97469       }
97470
97471
97472       action.disabled = function(graph) {
97473           var way = graph.entity(wayId),
97474               nodes = graph.childNodes(way),
97475               points = uniq(nodes).map(function(n) { return projection(n.loc); });
97476
97477           if (squareness(points)) {
97478               return false;
97479           }
97480
97481           return 'not_squarish';
97482       };
97483
97484
97485       action.transitionable = true;
97486
97487
97488       return action;
97489   }
97490
97491   // `actionRestrictTurn` creates a turn restriction relation.
97492   //
97493   // `turn` must be an `osmTurn` object
97494   // see osm/intersection.js, pathToTurn()
97495   //
97496   // This specifies a restriction of type `restriction` when traveling from
97497   // `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`.
97498   // (The action does not check that these entities form a valid intersection.)
97499   //
97500   // From, to, and via ways should be split before calling this action.
97501   // (old versions of the code would split the ways here, but we no longer do it)
97502   //
97503   // For testing convenience, accepts a restrictionID to assign to the new
97504   // relation. Normally, this will be undefined and the relation will
97505   // automatically be assigned a new ID.
97506   //
97507   function actionRestrictTurn(turn, restrictionType, restrictionID) {
97508
97509       return function(graph) {
97510           var fromWay = graph.entity(turn.from.way);
97511           var toWay = graph.entity(turn.to.way);
97512           var viaNode = turn.via.node && graph.entity(turn.via.node);
97513           var viaWays = turn.via.ways && turn.via.ways.map(function(id) { return graph.entity(id); });
97514           var members = [];
97515
97516           members.push({ id: fromWay.id, type: 'way',  role: 'from' });
97517
97518           if (viaNode) {
97519               members.push({ id: viaNode.id,  type: 'node', role: 'via' });
97520           } else if (viaWays) {
97521               viaWays.forEach(function(viaWay) {
97522                   members.push({ id: viaWay.id,  type: 'way', role: 'via' });
97523               });
97524           }
97525
97526           members.push({ id: toWay.id, type: 'way',  role: 'to' });
97527
97528           return graph.replace(osmRelation({
97529               id: restrictionID,
97530               tags: {
97531                   type: 'restriction',
97532                   restriction: restrictionType
97533               },
97534               members: members
97535           }));
97536       };
97537   }
97538
97539   function actionRevert(id) {
97540       var action = function(graph) {
97541           var entity = graph.hasEntity(id),
97542               base = graph.base().entities[id];
97543
97544           if (entity && !base) {    // entity will be removed..
97545               if (entity.type === 'node') {
97546                   graph.parentWays(entity)
97547                       .forEach(function(parent) {
97548                           parent = parent.removeNode(id);
97549                           graph = graph.replace(parent);
97550
97551                           if (parent.isDegenerate()) {
97552                               graph = actionDeleteWay(parent.id)(graph);
97553                           }
97554                       });
97555               }
97556
97557               graph.parentRelations(entity)
97558                   .forEach(function(parent) {
97559                       parent = parent.removeMembersWithID(id);
97560                       graph = graph.replace(parent);
97561
97562                       if (parent.isDegenerate()) {
97563                           graph = actionDeleteRelation(parent.id)(graph);
97564                       }
97565                   });
97566           }
97567
97568           return graph.revert(id);
97569       };
97570
97571       return action;
97572   }
97573
97574   function actionRotate(rotateIds, pivot, angle, projection) {
97575
97576       var action = function(graph) {
97577           return graph.update(function(graph) {
97578               utilGetAllNodes(rotateIds, graph).forEach(function(node) {
97579                   var point = geoRotate([projection(node.loc)], angle, pivot)[0];
97580                   graph = graph.replace(node.move(projection.invert(point)));
97581               });
97582           });
97583       };
97584
97585       return action;
97586   }
97587
97588   /* Built-in method references for those with the same name as other `lodash` methods. */
97589   var nativeMax$8 = Math.max;
97590
97591   /**
97592    * Gets the index at which the first occurrence of `value` is found in `array`
97593    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
97594    * for equality comparisons. If `fromIndex` is negative, it's used as the
97595    * offset from the end of `array`.
97596    *
97597    * @static
97598    * @memberOf _
97599    * @since 0.1.0
97600    * @category Array
97601    * @param {Array} array The array to inspect.
97602    * @param {*} value The value to search for.
97603    * @param {number} [fromIndex=0] The index to search from.
97604    * @returns {number} Returns the index of the matched value, else `-1`.
97605    * @example
97606    *
97607    * _.indexOf([1, 2, 1, 2], 2);
97608    * // => 1
97609    *
97610    * // Search from the `fromIndex`.
97611    * _.indexOf([1, 2, 1, 2], 2, 2);
97612    * // => 3
97613    */
97614   function indexOf(array, value, fromIndex) {
97615     var length = array == null ? 0 : array.length;
97616     if (!length) {
97617       return -1;
97618     }
97619     var index = fromIndex == null ? 0 : toInteger(fromIndex);
97620     if (index < 0) {
97621       index = nativeMax$8(length + index, 0);
97622     }
97623     return baseIndexOf(array, value, index);
97624   }
97625
97626   // Split a way at the given node.
97627   //
97628   // Optionally, split only the given ways, if multiple ways share
97629   // the given node.
97630   //
97631   // This is the inverse of `iD.actionJoin`.
97632   //
97633   // For testing convenience, accepts an ID to assign to the new way.
97634   // Normally, this will be undefined and the way will automatically
97635   // be assigned a new ID.
97636   //
97637   // Reference:
97638   //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
97639   //
97640   function actionSplit(nodeId, newWayIds) {
97641       var _wayIDs;
97642
97643       // If the way is closed, we need to search for a partner node
97644       // to split the way at.
97645       //
97646       // The following looks for a node that is both far away from
97647       // the initial node in terms of way segment length and nearby
97648       // in terms of beeline-distance. This assures that areas get
97649       // split on the most "natural" points (independent of the number
97650       // of nodes).
97651       // For example: bone-shaped areas get split across their waist
97652       // line, circles across the diameter.
97653       function splitArea(nodes, idxA, graph) {
97654           var lengths = new Array(nodes.length);
97655           var length;
97656           var i;
97657           var best = 0;
97658           var idxB;
97659
97660           function wrap(index) {
97661               return utilWrap(index, nodes.length);
97662           }
97663
97664           function dist(nA, nB) {
97665               var locA = graph.entity(nA).loc;
97666               var locB = graph.entity(nB).loc;
97667               var epsilon = 1e-6;
97668               return (locA && locB) ? geoSphericalDistance(locA, locB) : epsilon;
97669           }
97670
97671           // calculate lengths
97672           length = 0;
97673           for (i = wrap(idxA+1); i !== idxA; i = wrap(i+1)) {
97674               length += dist(nodes[i], nodes[wrap(i-1)]);
97675               lengths[i] = length;
97676           }
97677
97678           length = 0;
97679           for (i = wrap(idxA-1); i !== idxA; i = wrap(i-1)) {
97680               length += dist(nodes[i], nodes[wrap(i+1)]);
97681               if (length < lengths[i])
97682                   lengths[i] = length;
97683           }
97684
97685           // determine best opposite node to split
97686           for (i = 0; i < nodes.length; i++) {
97687               var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
97688               if (cost > best) {
97689                   idxB = i;
97690                   best = cost;
97691               }
97692           }
97693
97694           return idxB;
97695       }
97696
97697
97698       function split(graph, wayA, newWayId) {
97699           var wayB = osmWay({id: newWayId, tags: wayA.tags});   // `wayB` is the NEW way
97700           var origNodes = wayA.nodes.slice();
97701           var nodesA;
97702           var nodesB;
97703           var isArea = wayA.isArea();
97704           var isOuter = osmIsOldMultipolygonOuterMember(wayA, graph);
97705
97706           if (wayA.isClosed()) {
97707               var nodes = wayA.nodes.slice(0, -1);
97708               var idxA = indexOf(nodes, nodeId);
97709               var idxB = splitArea(nodes, idxA, graph);
97710
97711               if (idxB < idxA) {
97712                   nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
97713                   nodesB = nodes.slice(idxB, idxA + 1);
97714               } else {
97715                   nodesA = nodes.slice(idxA, idxB + 1);
97716                   nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
97717               }
97718           } else {
97719               var idx = indexOf(wayA.nodes, nodeId, 1);
97720               nodesA = wayA.nodes.slice(0, idx + 1);
97721               nodesB = wayA.nodes.slice(idx);
97722           }
97723
97724           wayA = wayA.update({nodes: nodesA});
97725           wayB = wayB.update({nodes: nodesB});
97726
97727           graph = graph.replace(wayA);
97728           graph = graph.replace(wayB);
97729
97730           graph.parentRelations(wayA).forEach(function(relation) {
97731               var member;
97732
97733               // Turn restrictions - make sure:
97734               // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation
97735               //    (whichever one is connected to the VIA node/ways)
97736               // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way
97737               if (relation.isRestriction()) {
97738                   var f = relation.memberByRole('from');
97739                   var v = relation.membersByRole('via');
97740                   var t = relation.memberByRole('to');
97741                   var i;
97742
97743                   // 1. split a FROM/TO
97744                   if (f.id === wayA.id || t.id === wayA.id) {
97745                       var keepB = false;
97746                       if (v.length === 1 && v[0].type === 'node') {   // check via node
97747                           keepB = wayB.contains(v[0].id);
97748                       } else {                                        // check via way(s)
97749                           for (i = 0; i < v.length; i++) {
97750                               if (v[i].type === 'way') {
97751                                   var wayVia = graph.hasEntity(v[i].id);
97752                                   if (wayVia && intersection(wayB.nodes, wayVia.nodes).length) {
97753                                       keepB = true;
97754                                       break;
97755                                   }
97756                               }
97757                           }
97758                       }
97759
97760                       if (keepB) {
97761                           relation = relation.replaceMember(wayA, wayB);
97762                           graph = graph.replace(relation);
97763                       }
97764
97765                   // 2. split a VIA
97766                   } else {
97767                       for (i = 0; i < v.length; i++) {
97768                           if (v[i].type === 'way' && v[i].id === wayA.id) {
97769                               member = {
97770                                   id: wayB.id,
97771                                   type: 'way',
97772                                   role: 'via'
97773                               };
97774                               graph = actionAddMember(relation.id, member, v[i].index + 1)(graph);
97775                               break;
97776                           }
97777                       }
97778                   }
97779
97780               // All other relations (Routes, Multipolygons, etc):
97781               // 1. Both `wayA` and `wayB` remain in the relation
97782               // 2. But must be inserted as a pair (see `actionAddMember` for details)
97783               } else {
97784                   if (relation === isOuter) {
97785                       graph = graph.replace(relation.mergeTags(wayA.tags));
97786                       graph = graph.replace(wayA.update({tags: {}}));
97787                       graph = graph.replace(wayB.update({tags: {}}));
97788                   }
97789
97790                   member = {
97791                       id: wayB.id,
97792                       type: 'way',
97793                       role: relation.memberById(wayA.id).role
97794                   };
97795
97796                   var insertPair = {
97797                       originalID: wayA.id,
97798                       insertedID: wayB.id,
97799                       nodes: origNodes
97800                   };
97801
97802                   graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
97803               }
97804           });
97805
97806           if (!isOuter && isArea) {
97807               var multipolygon = osmRelation({
97808                   tags: assignIn({}, wayA.tags, {type: 'multipolygon'}),
97809                   members: [
97810                       {id: wayA.id, role: 'outer', type: 'way'},
97811                       {id: wayB.id, role: 'outer', type: 'way'}
97812                   ]
97813               });
97814
97815               graph = graph.replace(multipolygon);
97816               graph = graph.replace(wayA.update({tags: {}}));
97817               graph = graph.replace(wayB.update({tags: {}}));
97818           }
97819
97820           return graph;
97821       }
97822
97823
97824       var action = function(graph) {
97825           var candidates = action.ways(graph);
97826           for (var i = 0; i < candidates.length; i++) {
97827               graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
97828           }
97829           return graph;
97830       };
97831
97832
97833       action.ways = function(graph) {
97834           var node = graph.entity(nodeId);
97835           var parents = graph.parentWays(node);
97836           var hasLines = some(parents, function(parent) { return parent.geometry(graph) === 'line'; });
97837
97838           return parents.filter(function(parent) {
97839               if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
97840                   return false;
97841
97842               if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line')
97843                   return false;
97844
97845               if (parent.isClosed()) {
97846                   return true;
97847               }
97848
97849               for (var i = 1; i < parent.nodes.length - 1; i++) {
97850                   if (parent.nodes[i] === nodeId) {
97851                       return true;
97852                   }
97853               }
97854
97855               return false;
97856           });
97857       };
97858
97859
97860       action.disabled = function(graph) {
97861           var candidates = action.ways(graph);
97862           if (candidates.length === 0 || (_wayIDs && _wayIDs.length !== candidates.length))
97863               return 'not_eligible';
97864       };
97865
97866
97867       action.limitWays = function(_) {
97868           if (!arguments.length) return _wayIDs;
97869           _wayIDs = _;
97870           return action;
97871       };
97872
97873
97874       return action;
97875   }
97876
97877   /*
97878    * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
97879    */
97880   function actionStraighten(wayId, projection) {
97881
97882       function positionAlongWay(n, s, e) {
97883           return ((n[0] - s[0]) * (e[0] - s[0]) + (n[1] - s[1]) * (e[1] - s[1])) /
97884                   (Math.pow(e[0] - s[0], 2) + Math.pow(e[1] - s[1], 2));
97885       }
97886
97887
97888       var action = function(graph, t) {
97889           if (t === null || !isFinite(t)) t = 1;
97890           t = Math.min(Math.max(+t, 0), 1);
97891
97892           var way = graph.entity(wayId),
97893               nodes = graph.childNodes(way),
97894               points = nodes.map(function(n) { return projection(n.loc); }),
97895               startPoint = points[0],
97896               endPoint = points[points.length-1],
97897               toDelete = [],
97898               i;
97899
97900           for (i = 1; i < points.length-1; i++) {
97901               var node = nodes[i],
97902                   point = points[i];
97903
97904               if (t < 1 || graph.parentWays(node).length > 1 ||
97905                   graph.parentRelations(node).length ||
97906                   node.hasInterestingTags()) {
97907
97908                   var u = positionAlongWay(point, startPoint, endPoint),
97909                       p = [
97910                           startPoint[0] + u * (endPoint[0] - startPoint[0]),
97911                           startPoint[1] + u * (endPoint[1] - startPoint[1])
97912                       ],
97913                       loc2 = projection.invert(p);
97914
97915                   graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
97916
97917               } else {
97918                   // safe to delete
97919                   if (toDelete.indexOf(node) === -1) {
97920                       toDelete.push(node);
97921                   }
97922               }
97923           }
97924
97925           for (i = 0; i < toDelete.length; i++) {
97926               graph = actionDeleteNode(toDelete[i].id)(graph);
97927           }
97928
97929           return graph;
97930       };
97931
97932
97933       action.disabled = function(graph) {
97934           // check way isn't too bendy
97935           var way = graph.entity(wayId),
97936               nodes = graph.childNodes(way),
97937               points = nodes.map(function(n) { return projection(n.loc); }),
97938               startPoint = points[0],
97939               endPoint = points[points.length-1],
97940               threshold = 0.2 * geoVecLength(startPoint, endPoint),
97941               i;
97942
97943           if (threshold === 0) {
97944               return 'too_bendy';
97945           }
97946
97947           for (i = 1; i < points.length-1; i++) {
97948               var point = points[i],
97949                   u = positionAlongWay(point, startPoint, endPoint),
97950                   p0 = startPoint[0] + u * (endPoint[0] - startPoint[0]),
97951                   p1 = startPoint[1] + u * (endPoint[1] - startPoint[1]),
97952                   dist = Math.sqrt(Math.pow(p0 - point[0], 2) + Math.pow(p1 - point[1], 2));
97953
97954               // to bendy if point is off by 20% of total start/end distance in projected space
97955               if (isNaN(dist) || dist > threshold) {
97956                   return 'too_bendy';
97957               }
97958           }
97959       };
97960
97961
97962       action.transitionable = true;
97963
97964
97965       return action;
97966   }
97967
97968   // `actionUnrestrictTurn` deletes a turn restriction relation.
97969   //
97970   // `turn` must be an `osmTurn` object with a `restrictionID` property.
97971   // see osm/intersection.js, pathToTurn()
97972   //
97973   function actionUnrestrictTurn(turn) {
97974       return function(graph) {
97975           return actionDeleteRelation(turn.restrictionID)(graph);
97976       };
97977   }
97978
97979   /* Reflect the given area around its axis of symmetry */
97980   function actionReflect(reflectIds, projection) {
97981       var useLongAxis = true;
97982
97983
97984       // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
97985       // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
97986       function getSmallestSurroundingRectangle(graph, nodes) {
97987           var points = nodes.map(function(n) { return projection(n.loc); }),
97988               hull = d3_polygonHull(points),
97989               centroid = d3_polygonCentroid(hull),
97990               minArea = Infinity,
97991               ssrExtent = [],
97992               ssrAngle = 0,
97993               c1 = hull[0];
97994
97995           for (var i = 0; i <= hull.length - 1; i++) {
97996               var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1],
97997                   angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]),
97998                   poly = geoRotate(hull, -angle, centroid),
97999                   extent = poly.reduce(function(extent, point) {
98000                           return extent.extend(geoExtent(point));
98001                       }, geoExtent()),
98002                   area = extent.area();
98003
98004               if (area < minArea) {
98005                   minArea = area;
98006                   ssrExtent = extent;
98007                   ssrAngle = angle;
98008               }
98009               c1 = c2;
98010           }
98011
98012           return {
98013               poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
98014               angle: ssrAngle
98015           };
98016       }
98017
98018
98019       var action = function(graph, t) {
98020           if (t === null || !isFinite(t)) t = 1;
98021           t = Math.min(Math.max(+t, 0), 1);
98022
98023           var nodes = utilGetAllNodes(reflectIds, graph),
98024               ssr = getSmallestSurroundingRectangle(graph, nodes);
98025
98026           // Choose line pq = axis of symmetry.
98027           // The shape's surrounding rectangle has 2 axes of symmetry.
98028           // Reflect across the longer axis by default.
98029           var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ],
98030               q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ],
98031               p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ],
98032               q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ],
98033               p, q;
98034
98035           var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
98036           if ((useLongAxis && isLong) || (!useLongAxis && !isLong)) {
98037               p = p1;
98038               q = q1;
98039           } else {
98040               p = p2;
98041               q = q2;
98042           }
98043
98044           // reflect c across pq
98045           // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
98046           var dx = q[0] - p[0];
98047           var dy = q[1] - p[1];
98048           var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
98049           var b = 2 * dx * dy / (dx * dx + dy * dy);
98050           for (var i = 0; i < nodes.length; i++) {
98051               var node = nodes[i];
98052               var c = projection(node.loc);
98053               var c2 = [
98054                   a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
98055                   b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
98056               ];
98057               var loc2 = projection.invert(c2);
98058               node = node.move(geoVecInterp(node.loc, loc2, t));
98059               graph = graph.replace(node);
98060           }
98061
98062           return graph;
98063       };
98064
98065
98066       action.useLongAxis = function(_) {
98067           if (!arguments.length) return useLongAxis;
98068           useLongAxis = _;
98069           return action;
98070       };
98071
98072
98073       action.transitionable = true;
98074
98075
98076       return action;
98077   }
98078
98079   function actionDetachNode(nodeID) {
98080
98081       var action = function(graph) {
98082           var node = graph.entity(nodeID);
98083
98084           // Create a new node to replace the one we will detach
98085           var replacement = osmNode({ loc: node.loc });
98086           graph = graph.replace(replacement);
98087
98088           // Process each way in turn, updating the graph as we go
98089           graph = graph.parentWays(node)
98090               .reduce(function(accGraph, parentWay) {
98091                   return accGraph.replace(parentWay.replaceNode(nodeID, replacement.id));
98092               }, graph);
98093
98094           // Process any relations too
98095           return graph.parentRelations(node)
98096               .reduce(function(accGraph, parentRel) {
98097                   return accGraph.replace(parentRel.replaceMember(node, replacement));
98098               }, graph);
98099       };
98100
98101
98102       action.disabled = function(graph) {
98103           var node = graph.entity(nodeID);
98104           var parentRels = graph.parentRelations(node);
98105
98106           for (var i = 0; i < parentRels.length; i++) {
98107               var relation = parentRels[i];
98108               if (!relation.isValidRestriction()) continue;
98109
98110               for (var j = 0; j < relation.members.length; j++) {
98111                   var m = relation.members[j];
98112                   if (m.id === nodeID && (m.role === 'via' || m.role === 'location_hint')) {
98113                       return 'restriction';
98114                   }
98115               }
98116           }
98117
98118           return false;
98119       };
98120
98121
98122       return action;
98123   }
98124
98125   var Connection = services.osm;
98126
98127   var debug = false;
98128
98129   var iD = /*#__PURE__*/Object.freeze({
98130     Connection: Connection,
98131     debug: debug,
98132     d3: index$3,
98133     coreValidator: coreValidator,
98134     Context: coreContext,
98135     setAreaKeys: setAreaKeys,
98136     get areaKeys () { return areaKeys; },
98137     Difference: coreDifference,
98138     Graph: coreGraph,
98139     History: coreHistory,
98140     Tree: coreTree,
98141     geoCross: geoVecCross,
98142     geoInterp: geoVecInterp,
98143     geoRoundCoordinates: geoVecFloor,
98144     geoEuclideanDistance: geoVecLength,
98145     Entity: osmEntity,
98146     Node: osmNode,
98147     Relation: osmRelation,
98148     Way: osmWay,
98149     BackgroundSource: rendererBackgroundSource,
98150     Background: rendererBackground,
98151     Features: rendererFeatures,
98152     Map: rendererMap,
98153     TileLayer: rendererTileLayer,
98154     Detect: utilDetect,
98155     uiPreset: uiPresetEditor,
98156     actionAddEntity: actionAddEntity,
98157     actionAddMember: actionAddMember,
98158     actionAddMidpoint: actionAddMidpoint,
98159     actionAddVertex: actionAddVertex,
98160     actionChangeMember: actionChangeMember,
98161     actionChangePreset: actionChangePreset,
98162     actionChangeTags: actionChangeTags,
98163     actionCircularize: actionCircularize,
98164     actionConnect: actionConnect,
98165     actionCopyEntities: actionCopyEntities,
98166     actionDeleteMember: actionDeleteMember,
98167     actionDeleteMultiple: actionDeleteMultiple,
98168     actionDeleteNode: actionDeleteNode,
98169     actionDeleteRelation: actionDeleteRelation,
98170     actionDeleteWay: actionDeleteWay,
98171     actionDiscardTags: actionDiscardTags,
98172     actionDisconnect: actionDisconnect,
98173     actionJoin: actionJoin,
98174     actionMerge: actionMerge,
98175     actionMergeNodes: actionMergeNodes,
98176     actionMergePolygon: actionMergePolygon,
98177     actionMergeRemoteChanges: actionMergeRemoteChanges,
98178     actionMove: actionMove,
98179     actionMoveNode: actionMoveNode,
98180     actionNoop: actionNoop,
98181     actionOrthogonalize: actionOrthogonalize,
98182     actionRestrictTurn: actionRestrictTurn,
98183     actionReverse: actionReverse,
98184     actionRevert: actionRevert,
98185     actionRotate: actionRotate,
98186     actionSplit: actionSplit,
98187     actionStraighten: actionStraighten,
98188     actionUnrestrictTurn: actionUnrestrictTurn,
98189     actionReflect: actionReflect,
98190     actionDetachNode: actionDetachNode,
98191     behaviorAddWay: behaviorAddWay,
98192     behaviorBreathe: behaviorBreathe,
98193     behaviorCopy: behaviorCopy,
98194     behaviorDrag: behaviorDrag,
98195     behaviorDrawWay: behaviorDrawWay,
98196     behaviorDraw: behaviorDraw,
98197     behaviorEdit: behaviorEdit,
98198     behaviorHash: behaviorHash,
98199     behaviorHover: behaviorHover,
98200     behaviorLasso: behaviorLasso,
98201     behaviorOperation: behaviorOperation,
98202     behaviorPaste: behaviorPaste,
98203     behaviorSelect: behaviorSelect,
98204     behaviorTail: behaviorTail,
98205     coreContext: coreContext,
98206     coreDifference: coreDifference,
98207     coreGraph: coreGraph,
98208     coreHistory: coreHistory,
98209     coreTree: coreTree,
98210     data: data,
98211     dataWikipedia: wikipedia$2,
98212     dataAddressFormats: dataAddressFormats,
98213     dataDeprecated: dataDeprecated,
98214     dataDiscarded: dataDiscarded,
98215     dataLocales: dataLocales,
98216     dataPhoneFormats: dataPhoneFormats,
98217     dataShortcuts: dataShortcuts,
98218     dataImperial: dataImperial,
98219     dataDriveLeft: dataDriveLeft,
98220     dataEn: en,
98221     geoExtent: geoExtent,
98222     geoLatToMeters: geoLatToMeters,
98223     geoLonToMeters: geoLonToMeters,
98224     geoMetersToLat: geoMetersToLat,
98225     geoMetersToLon: geoMetersToLon,
98226     geoMetersToOffset: geoMetersToOffset,
98227     geoOffsetToMeters: geoOffsetToMeters,
98228     geoScaleToZoom: geoScaleToZoom,
98229     geoSphericalClosestNode: geoSphericalClosestNode,
98230     geoSphericalDistance: geoSphericalDistance,
98231     geoZoomToScale: geoZoomToScale,
98232     geoAngle: geoAngle,
98233     geoChooseEdge: geoChooseEdge,
98234     geoEdgeEqual: geoEdgeEqual,
98235     geoHasLineIntersections: geoHasLineIntersections,
98236     geoHasSelfIntersections: geoHasSelfIntersections,
98237     geoRotate: geoRotate,
98238     geoLineIntersection: geoLineIntersection,
98239     geoPathHasIntersections: geoPathHasIntersections,
98240     geoPathIntersections: geoPathIntersections,
98241     geoPathLength: geoPathLength,
98242     geoPointInPolygon: geoPointInPolygon,
98243     geoPolygonContainsPolygon: geoPolygonContainsPolygon,
98244     geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
98245     geoViewportEdge: geoViewportEdge,
98246     geoRawMercator: geoRawMercator,
98247     geoVecAdd: geoVecAdd,
98248     geoVecAngle: geoVecAngle,
98249     geoVecCross: geoVecCross,
98250     geoVecDot: geoVecDot,
98251     geoVecEqual: geoVecEqual,
98252     geoVecFloor: geoVecFloor,
98253     geoVecInterp: geoVecInterp,
98254     geoVecLength: geoVecLength,
98255     geoVecSubtract: geoVecSubtract,
98256     geoVecScale: geoVecScale,
98257     modeAddArea: modeAddArea,
98258     modeAddLine: modeAddLine,
98259     modeAddPoint: modeAddPoint,
98260     modeAddNote: modeAddNote,
98261     modeBrowse: modeBrowse,
98262     modeDragNode: modeDragNode,
98263     modeDragNote: modeDragNote,
98264     modeDrawArea: modeDrawArea,
98265     modeDrawLine: modeDrawLine,
98266     modeMove: modeMove,
98267     modeRotate: modeRotate,
98268     modeSave: modeSave,
98269     modeSelect: modeSelect,
98270     modeSelectData: modeSelectData,
98271     modeSelectError: modeSelectError,
98272     modeSelectNote: modeSelectNote,
98273     operationCircularize: operationCircularize,
98274     operationContinue: operationContinue,
98275     operationDelete: operationDelete,
98276     operationDisconnect: operationDisconnect,
98277     operationMerge: operationMerge,
98278     operationMove: operationMove,
98279     operationOrthogonalize: operationOrthogonalize,
98280     operationReflectShort: operationReflectShort,
98281     operationReflectLong: operationReflectLong,
98282     operationReverse: operationReverse,
98283     operationRotate: operationRotate,
98284     operationSplit: operationSplit,
98285     operationStraighten: operationStraighten,
98286     operationDetachNode: operationDetachNode,
98287     osmChangeset: osmChangeset,
98288     osmEntity: osmEntity,
98289     osmNode: osmNode,
98290     osmNote: osmNote,
98291     osmRelation: osmRelation,
98292     osmWay: osmWay,
98293     qaError: qaError,
98294     osmIntersection: osmIntersection,
98295     osmTurn: osmTurn,
98296     osmInferRestriction: osmInferRestriction,
98297     osmLanes: osmLanes,
98298     osmOldMultipolygonOuterMemberOfRelation: osmOldMultipolygonOuterMemberOfRelation,
98299     osmIsOldMultipolygonOuterMember: osmIsOldMultipolygonOuterMember,
98300     osmOldMultipolygonOuterMember: osmOldMultipolygonOuterMember,
98301     osmJoinWays: osmJoinWays,
98302     osmOneWayTags: osmOneWayTags,
98303     osmPavedTags: osmPavedTags,
98304     osmIsInterestingTag: osmIsInterestingTag,
98305     presetCategory: presetCategory,
98306     presetCollection: presetCollection,
98307     presetField: presetField,
98308     presetPreset: presetPreset,
98309     presetIndex: presetIndex,
98310     rendererBackgroundSource: rendererBackgroundSource,
98311     rendererBackground: rendererBackground,
98312     rendererFeatures: rendererFeatures,
98313     rendererMap: rendererMap,
98314     rendererTileLayer: rendererTileLayer,
98315     services: services,
98316     serviceKeepRight: serviceKeepRight,
98317     serviceImproveOSM: serviceImproveOSM,
98318     serviceMapillary: serviceMapillary,
98319     serviceMapRules: serviceMapRules,
98320     serviceNominatim: serviceNominatim,
98321     serviceOpenstreetcam: serviceOpenstreetcam,
98322     serviceOsm: serviceOsm,
98323     serviceOsmWikibase: serviceOsmWikibase,
98324     serviceStreetside: serviceStreetside,
98325     serviceTaginfo: serviceTaginfo,
98326     serviceVectorTile: serviceVectorTile,
98327     serviceWikidata: serviceWikidata,
98328     serviceWikipedia: serviceWikipedia,
98329     svgAreas: svgAreas,
98330     svgData: svgData,
98331     svgDebug: svgDebug,
98332     svgDefs: svgDefs,
98333     svgKeepRight: svgKeepRight,
98334     svgIcon: svgIcon,
98335     svgGeolocate: svgGeolocate,
98336     svgLabels: svgLabels,
98337     svgLayers: svgLayers,
98338     svgLines: svgLines,
98339     svgMapillaryImages: svgMapillaryImages,
98340     svgMapillarySigns: svgMapillarySigns,
98341     svgMidpoints: svgMidpoints,
98342     svgNotes: svgNotes,
98343     svgMarkerSegments: svgMarkerSegments,
98344     svgOpenstreetcamImages: svgOpenstreetcamImages,
98345     svgOsm: svgOsm,
98346     svgPassiveVertex: svgPassiveVertex,
98347     svgPath: svgPath,
98348     svgPointTransform: svgPointTransform,
98349     svgPoints: svgPoints,
98350     svgRelationMemberTags: svgRelationMemberTags,
98351     svgSegmentWay: svgSegmentWay,
98352     svgStreetside: svgStreetside,
98353     svgTagClasses: svgTagClasses,
98354     svgTouch: svgTouch,
98355     svgTurns: svgTurns,
98356     svgVertices: svgVertices,
98357     uiFields: uiFields,
98358     uiFieldDefaultCheck: uiFieldCheck,
98359     uiFieldOnewayCheck: uiFieldCheck,
98360     uiFieldCheck: uiFieldCheck,
98361     uiFieldMultiCombo: uiFieldCombo,
98362     uiFieldNetworkCombo: uiFieldCombo,
98363     uiFieldSemiCombo: uiFieldCombo,
98364     uiFieldTypeCombo: uiFieldCombo,
98365     uiFieldCombo: uiFieldCombo,
98366     uiFieldUrl: uiFieldText,
98367     uiFieldNumber: uiFieldText,
98368     uiFieldTel: uiFieldText,
98369     uiFieldEmail: uiFieldText,
98370     uiFieldText: uiFieldText,
98371     uiFieldAccess: uiFieldAccess,
98372     uiFieldAddress: uiFieldAddress,
98373     uiFieldCycleway: uiFieldCycleway,
98374     uiFieldLanes: uiFieldLanes,
98375     uiFieldLocalized: uiFieldLocalized,
98376     uiFieldMaxspeed: uiFieldMaxspeed,
98377     uiFieldStructureRadio: uiFieldRadio,
98378     uiFieldRadio: uiFieldRadio,
98379     uiFieldRestrictions: uiFieldRestrictions,
98380     uiFieldTextarea: uiFieldTextarea,
98381     uiFieldWikidata: uiFieldWikidata,
98382     uiFieldWikipedia: uiFieldWikipedia,
98383     uiIntro: uiIntro,
98384     uiInfoPanels: uiInfoPanels,
98385     uiPanelBackground: uiPanelBackground,
98386     uiPanelHistory: uiPanelHistory,
98387     uiPanelLocation: uiPanelLocation,
98388     uiPanelMeasurement: uiPanelMeasurement,
98389     uiSettingsCustomBackground: uiSettingsCustomBackground,
98390     uiSettingsCustomData: uiSettingsCustomData,
98391     uiInit: uiInit,
98392     uiAccount: uiAccount,
98393     uiAttribution: uiAttribution,
98394     uiBackground: uiBackground,
98395     uiBackgroundDisplayOptions: uiBackgroundDisplayOptions,
98396     uiBackgroundOffset: uiBackgroundOffset,
98397     uiChangesetEditor: uiChangesetEditor,
98398     uiCmd: uiCmd,
98399     uiCombobox: uiCombobox,
98400     uiCommit: uiCommit,
98401     uiCommitChanges: uiCommitChanges,
98402     uiCommitWarnings: uiCommitWarnings,
98403     uiConfirm: uiConfirm,
98404     uiConflicts: uiConflicts,
98405     uiContributors: uiContributors,
98406     uiCurtain: uiCurtain,
98407     uiDataEditor: uiDataEditor,
98408     uiDataHeader: uiDataHeader,
98409     uiDisclosure: uiDisclosure,
98410     uiEditMenu: uiEditMenu,
98411     uiEntityEditor: uiEntityEditor,
98412     uiFeatureInfo: uiFeatureInfo,
98413     uiFeatureList: uiFeatureList,
98414     uiField: uiField,
98415     uiFieldHelp: uiFieldHelp,
98416     uiFlash: uiFlash,
98417     uiFormFields: uiFormFields,
98418     uiFullScreen: uiFullScreen,
98419     uiGeolocate: uiGeolocate,
98420     uiHelp: uiHelp,
98421     uiImproveOsmComments: uiImproveOsmComments,
98422     uiImproveOsmDetails: uiImproveOsmDetails,
98423     uiImproveOsmEditor: uiImproveOsmEditor,
98424     uiImproveOsmHeader: uiImproveOsmHeader,
98425     uiInfo: uiInfo,
98426     uiInspector: uiInspector,
98427     uiKeepRightDetails: uiKeepRightDetails,
98428     uiKeepRightEditor: uiKeepRightEditor,
98429     uiKeepRightHeader: uiKeepRightHeader,
98430     uiLasso: uiLasso,
98431     uiLoading: uiLoading,
98432     uiMapData: uiMapData,
98433     uiMapInMap: uiMapInMap,
98434     uiModal: uiModal,
98435     uiModes: uiModes,
98436     uiNotice: uiNotice,
98437     uiNoteComments: uiNoteComments,
98438     uiNoteEditor: uiNoteEditor,
98439     uiNoteHeader: uiNoteHeader,
98440     uiNoteReport: uiNoteReport,
98441     uiPresetEditor: uiPresetEditor,
98442     uiPresetIcon: uiPresetIcon,
98443     uiPresetList: uiPresetList,
98444     uiQuickLinks: uiQuickLinks,
98445     uiRadialMenu: uiRadialMenu,
98446     uiRawMemberEditor: uiRawMemberEditor,
98447     uiRawMembershipEditor: uiRawMembershipEditor,
98448     uiRawTagEditor: uiRawTagEditor,
98449     uiRestore: uiRestore,
98450     uiSave: uiSave,
98451     uiScale: uiScale,
98452     uiSelectionList: uiSelectionList,
98453     uiSidebar: uiSidebar,
98454     uiSourceSwitch: uiSourceSwitch,
98455     uiSpinner: uiSpinner,
98456     uiSplash: uiSplash,
98457     uiStatus: uiStatus,
98458     uiSuccess: uiSuccess,
98459     uiTagReference: uiTagReference,
98460     uiToggle: uiToggle,
98461     uiTooltipHtml: uiTooltipHtml,
98462     uiUndoRedo: uiUndoRedo,
98463     uiVersion: uiVersion,
98464     uiViewOnOSM: uiViewOnOSM,
98465     uiViewOnKeepRight: uiViewOnKeepRight,
98466     uiZoom: uiZoom,
98467     utilAsyncMap: utilAsyncMap,
98468     utilCallWhenIdle: utilCallWhenIdle,
98469     utilCleanTags: utilCleanTags,
98470     utilDisplayName: utilDisplayName,
98471     utilDisplayNameForPath: utilDisplayNameForPath,
98472     utilDisplayType: utilDisplayType,
98473     utilDisplayLabel: utilDisplayLabel,
98474     utilEntityRoot: utilEntityRoot,
98475     utilEditDistance: utilEditDistance,
98476     utilEntitySelector: utilEntitySelector,
98477     utilEntityOrMemberSelector: utilEntityOrMemberSelector,
98478     utilEntityOrDeepMemberSelector: utilEntityOrDeepMemberSelector,
98479     utilFastMouse: utilFastMouse,
98480     utilFunctor: utilFunctor,
98481     utilGetAllNodes: utilGetAllNodes,
98482     utilGetPrototypeOf: utilGetPrototypeOf,
98483     utilGetSetValue: utilGetSetValue,
98484     utilHashcode: utilHashcode,
98485     utilHighlightEntities: utilHighlightEntities,
98486     utilIdleWorker: utilIdleWorker,
98487     utilKeybinding: utilKeybinding,
98488     utilNoAuto: utilNoAuto,
98489     utilPrefixCSSProperty: utilPrefixCSSProperty,
98490     utilPrefixDOMProperty: utilPrefixDOMProperty,
98491     utilPreset: utilPreset,
98492     utilQsString: utilQsString,
98493     utilRebind: utilRebind,
98494     utilSetTransform: utilSetTransform,
98495     utilSessionMutex: utilSessionMutex,
98496     utilStringQs: utilStringQs,
98497     utilTagText: utilTagText,
98498     utilTiler: utilTiler,
98499     utilTriggerEvent: utilTriggerEvent,
98500     utilWrap: utilWrap,
98501     validationAlmostJunction: validationAlmostJunction,
98502     validationCrossingWays: validationCrossingWays,
98503     validationDeprecatedTag: validationDeprecatedTag,
98504     validationDisconnectedWay: validationDisconnectedWay,
98505     validationGenericName: validationGenericName,
98506     validationManyDeletions: validationManyDeletions,
98507     validationMaprules: validationMaprules,
98508     validationMissingTag: validationMissingTag,
98509     validationOldMultipolygon: validationOldMultipolygon,
98510     validationTagSuggestsArea: validationTagSuggestsArea
98511   });
98512
98513   window.iD = iD;
98514
98515 }());
98516 //# sourceMappingURL=iD.js.map